2013-07-09 9 views
40

JSON'u istek verilerinde bekleyeceği bir hizmetimi Flask'ta web servisime JSON olarak göndermeye çalışıyorum.Açısal JS POST isteği JSON verisi göndermiyor

Servis el ile JSON veri göndererek test ettim ve iyi çalışıyor. Ancak, açısal denetleyiciden bir http POST isteği yapmaya çalıştığımda, web sunucusu bana JSON almadığını söyleyen bir ileti gönderir. Ben Chrome'da istek başlıklarını incelediğinizde

o gördüğün takdirde veri uygulama/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 

olarak ayarlanmış olsa bile içerik türü ile JSON ancak düzenli anahtar/değer çiftleri halinde gönderiliyor görünmüyor Son satır İsteme Yükü, verilerin JSON biçiminde olmadığını görebilirsiniz.

$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; 
      }); 
}; 

Ben bir nesne {gibi verileri yolluyorum} ama ancak JSON.stringify tarafından seri sonra göndermeyi denedi yapmam şey:

Bu

benim açısal denetleyicisi HTTP POST çağrıdır sunucuya JSON gibi görünüyor.

Birileri yardım edebiliyorsa gerçekten takdir et. Veri nesnesini serileştiriyorsanız, uygun bir json nesnesi olmayacaktır.

+1

$ http POST, verilerini varsayılan olarak JSON olarak kodlanmış olarak gönderir. $ Http aramanızdan '' 'headers''' öğesini kaldırmayı deneyin.Varsayılan üstbilgilerin üzerine yazmanız ve bunun sunucuda beklenmedik sonuçlara yol açması olasıdır. Ayrıca istek başlıklarınızı iki kez kontrol edebilirsiniz. – Narretz

+0

@smartexpert çözümü buldunuz mu? Ben de aynı sorunu yaşıyorum, bunun için bir çözüm bulmak için çok uğraşırım ama eğer çözüm plz bana yardım edemezse, yapamam. teşekkürler alot – pejman

cevap

49

Sahip olduğunuz şeyi alın ve veri nesnesini bir JSON.stringify() ürününe sarın.

$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

Benim sorunum vardı veri vardı: {someVar: JSON.stringify (myVar)} ', bu cevapta ne yok. – JohnAllen

9

Ben senin örneğini denedim ve gayet güzel çalışıyor:

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} 
}); 

Çıktı:

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"} 

Eğer angularjs son sürümünü kullanıyor musunuz?

2

Bu arada senin yöntemi kullanabilirsiniz gelen bu çözüm

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

'data olmalıdır: '' params: ' – theRemix

+0

Bence bu doğru cevap. Birden fazla @RequestParams'a sahip olmanız gerekiyorsa, diğer herkes çalışmaz –

-1

yayınladığınız verileri bulmak için aşağıdaki kullanabilirsiniz FormData API https://developer.mozilla.org/en-US/docs/Web/API/FormData

var data = new FormData; 
data.append('from', from); 
data.append('to', to); 

$http({ 
    url: '/path', 
    method: 'POST', 
    data: data, 
    transformRequest: false, 
    headers: { 'Content-Type': undefined } 
}) 

kullanabilirsiniz .

data = json.loads(request.raw_post_data)

0

deneyin mutlak url kullanmak. hizmetin yanıt başlıklarını varsa o değil çalışıp çalışmadığını kontrol edin:

Access-Control-Allow-Origin ve Erişim-Control-Allow-Başlıkları örneğin

:

"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; 
});