2013-07-09 18 views
40

Próbuję wysłać obiekt jako JSON do mojego webservice w Kolbie, który oczekuje JSON w danych żądania.Żądanie kątowe JS POST nie wysyłające danych JSON

Testowałem usługę ręcznie, wysyłając dane JSON i działa dobrze. Jednak, gdy próbuję utworzyć żądanie HTTP POST przez kontroler kątowy, serwer WWW wysyła do mnie komunikat, że nie otrzymał JSON.

Kiedy sprawdzać nagłówki żądania w Chrome wydaje się, że dane nie są przesyłane w formacie JSON, ale regularnych par klucz/wartość nawet przez Content Type jest ustawiony na application/json

Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:49 
Content-Type:application/json;charset=UTF-8 
DNT:1 
Host:localhost:5000 
Origin:http://localhost:5000 
Referer:http://localhost:5000/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Request Payload 
application=AirFare&d1=10-APR-2013&d2=14-APR-2013 

Jeśli widziałeś ostatnia linia poniżej Request Payload, możesz zobaczyć dane nie w formacie JSON.

To wywołanie HTTP POST w moim kontrolera kątowej:

$http({ 
      url: '/user_to_itsr', 
      method: "POST", 
      data: {application:app, from:d1, to:d2}, 
      headers: {'Content-Type': 'application/json'} 
     }).success(function (data, status, headers, config) { 
       $scope.users = data.users; // assign $scope.persons here as promise is resolved here 
      }).error(function (data, status, headers, config) { 
       $scope.status = status + ' ' + headers; 
      }); 
}; 

jestem wysyłania danych jako obiekt {} ale starałem się wysłać go po szeregowania przez JSON.stringify jednak nic zrobić wydaje się wysłać JSON na serwer.

Naprawdę doceniam, że ktoś może pomóc.

+1

$ http POST wysyła dane domyślnie jako kodowane JSON. Spróbuj usunąć '' 'headers''' z twojego połączenia $ http.Możliwe, że nadpisujesz domyślne nagłówki, co prowadzi do nieoczekiwanych wyników na serwerze. Możesz również opublikować swoje nagłówki żądań, aby dokładnie sprawdzić. – Narretz

+0

@smartexpert znalazłeś rozwiązanie? Mam ten sam problem, próbuję dużo, aby znaleźć rozwiązanie, ale nie mogę, jeśli znajdziesz rozwiązanie, które mi pomoże. dziękuje dużo – pejman

Odpowiedz

49

Jeśli serializujesz obiekt danych, nie będzie to właściwy obiekt Json. Weź to, co masz, i po prostu owinąć obiekt danych w JSON.stringify().

$http({ 
    url: '/user_to_itsr', 
    method: "POST", 
    data: JSON.stringify({application:app, from:d1, to:d2}), 
    headers: {'Content-Type': 'application/json'} 
}).success(function (data, status, headers, config) { 
    $scope.users = data.users; // assign $scope.persons here as promise is resolved here 
}).error(function (data, status, headers, config) { 
    $scope.status = status + ' ' + headers; 
}); 
+0

Mój problem polegał na tym, że miałem 'data: {someVar: JSON.stringify (myVar)}', nie to, co jest w tej odpowiedzi. – JohnAllen

9

Próbowałem swój przykład i to działa dobrze:

var app = 'AirFare'; 
var d1 = new Date(); 
var d2 = new Date(); 

$http({ 
    url: '/api/test', 
    method: 'POST', 
    headers: { 'Content-Type': 'application/json' }, 
    data: {application: app, from: d1, to: d2} 
}); 

wyjściowa:

Content-Length:91 
Content-Type:application/json 
Host:localhost:1234 
Origin:http://localhost:1234 
Referer:http://localhost:1234/index.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Request Payload 
{"application":"AirFare","from":"2013-10-10T11:47:50.681Z","to":"2013-10-10T11:47:50.681Z"} 

Czy korzystasz z najnowszej wersji angularjs?

2

można wykorzystać metodę w ten sposób

var app = 'AirFare'; 
var d1 = new Date(); 
var d2 = new Date(); 

$http({ 
    url: '/api/apiControllerName/methodName', 
    method: 'POST', 
    params: {application:app, from:d1, to:d2}, 
    headers: { 'Content-Type': 'application/json;charset=utf-8' }, 
    //timeout: 1, 
    //cache: false, 
    //transformRequest: false, 
    //transformResponse: false 
}).then(function (results) { 
    return results; 
}).catch(function (e) { 

}); 
+4

powinno być 'data:' not 'params:' – theRemix

+0

Myślę, że to jest poprawna odpowiedź. Wszystkie inne nie działają, jeśli potrzebujesz kilku @RequestParams –

-1

można użyć następujących znaleźć zamieszczonych danych .

data = json.loads(request.raw_post_data)

0

spróbuje użyć bezwzględny adres URL. Jeśli nie prac, sprawdź czy reakcji serwisu zawiera nagłówki:

Access-Control-Allow-Origin i Access-Control-Allow-Główki

na przykład:

"Access-Control-Allow-Origin": "*" 
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept" 
-1
$http({ 
    url: '/api/user', 
    method: "POST", 
    data: angular.toJson(yourData) 
}).success(function (data, status, headers, config) { 
    $scope.users = data.users; 
}).error(function (data, status, headers, config) { 
    $scope.status = status + ' ' + headers; 
});