2013-04-24 19 views
52

कोणीय सही सामग्री प्रकार विकल्प जोड़ने नहीं है के साथ नहीं भेजा जा रहा है, मैं निम्न आदेश की कोशिश की:

$http({ 
    url: "http://localhost:8080/example/teste", 
    dataType: "json", 
    method: "POST", 
    headers: { 
     "Content-Type": "application/json" 
    } 
}).success(function(response){ 
    $scope.response = response; 
}).error(function(error){ 
    $scope.error = error; 
}); 

कोड ऊपर निम्नलिखित http अनुरोध उत्पन्न करता है:

POST http://localhost:8080/example/teste HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Content-Length: 0 
Cache-Control: no-cache 
Pragma: no-cache 
Origin: http://localhost:8080 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 
Content-Type: application/xml 
Accept: application/json, text/plain, */* 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:8080/example/index 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie: JSESSIONID=C404CE2DA653136971DD1A3C3EB3725B 

जैसा कि आप देख सकते हैं, "एप्लिकेशन/जेसन" के बजाय, सामग्री प्रकार "एप्लिकेशन/एक्सएमएल" है। क्या मुझसे कोई चूक हो रही है ?

उत्तर

79

आपको अनुरोध के साथ एक शरीर शामिल करने की आवश्यकता है। कोणीय सामग्री प्रकार के शीर्षलेख को अन्यथा हटा देता है।

data: ''$http पर तर्क के लिए data: '' जोड़ें।

+3

लेकिन क्या अगर मैं डेटा के रूप में एक वस्तु भेजना चाहते हैं? मैं एक एएसपी.नेट जेनेरिक HTTP हैंडलर के साथ काम कर रहा हूं, और किसी कारण से, 'context.Request.Params ["formData"] 'काम नहीं करता है, लेकिन एक स्टैक ओवरफ्लो पोस्ट ने मुझे' स्ट्रिंग जेसन = नया स्ट्रीम रीडर (संदर्भ। Request.InputStream)। ReadToEnd(); 'जो काम करता है, लेकिन मुझे इसका उपयोग करने के लिए बिल्कुल राहत नहीं मिली है क्योंकि मैं नाम से सबमिट किए गए अनुरोध पैरामीटर मान को एक्सेस करना चाहता हूं। –

+1

भगवान यह एक जीवन बचतकर्ता है !!! क्या यह डिफ़ॉल्ट HTTP प्रोटोकॉल व्यवहार या कोणीय $ http व्यवहार है? – jchnxu

+0

किसी भी [Restangular] (https://github.com/mgonto/restangular) का उपयोग करने के लिए, यहां इस समाधान को कार्यान्वित करने का एक उदाहरण दिया गया है: https://gist.github.com/sscovil/3bd0da1d98397213df54 –

26
$http({ 
    url: 'http://localhost:8080/example/teste', 
    dataType: 'json', 
    method: 'POST', 
    data: '', 
    headers: { 
     "Content-Type": "application/json" 
    } 

}).success(function(response){ 
    $scope.response = response; 
}).error(function(error){ 
    $scope.error = error; 
}); 

इस तरह प्रयास करें।

+2

मुझे डर है कि यह कोणीय 1.3.14 में काम नहीं करता है, यदि कोई डेटा नहीं है तो 'सामग्री-प्रकार' हटा दिया जाता है।रिक्त 'डेटा' पैरामीटर हालांकि समस्या हल करता है ... – IProblemFactory

+0

बहुत अजीब! यहां तक ​​कि अनुरोध के लिए भी मुझे डेटा प्रदान करना पड़ा: '' फ़ील्ड। हालांकि हम सभी जानते हैं कि जीईटी नहीं होना चाहिए! कोई विचार नहीं है कि जब कोई डेटा प्रदान नहीं किया जाता है तो angularjs सामग्री-प्रकार एप्लिकेशन/हेडर को अलग कर रहा है? – agpt

1

बढ़िया! ऊपर दिए गए समाधान ने मेरे लिए काम किया। GET कॉल के साथ एक ही समस्या थी।

method: 'GET', 
data: '', 
headers: { 
     "Content-Type": "application/json" 
} 
+1

कृपया अपने कोड स्निपेट में कुछ स्वरूपण जोड़ें। और वोटों से बचने के लिए खुद को बेहतर समझाएं – simonmorley

+0

अनुरोध प्राप्त करने के लिए कोई शरीर नहीं हो सकता है (http://stackoverflow.com/a/983458/2416700) इसलिए इस मामले में सामग्री-प्रकार व्यर्थ है – Evgeny

+0

यह सच है कि अनुरोध प्राप्त करने के लिए शरीर नहीं हो सकता , लेकिन अजीब स्ट्रिंग के रूप में डेटा प्रदान करते समय अजीब तो केवल सामग्री-प्रकार को लिया जाता है, अन्य बुद्धिमान angularjs उस हेडर को बंद कर देता है। !! – agpt

3
  $http({ 
       method: 'GET', 
       url:'/http://localhost:8080/example/test' + toto, 
       data: '', 
       headers: { 
        'Content-Type': 'application/json' 
       } 
      }).then(
       function(response) { 
        return response.data; 
       }, 
       function(errResponse) { 
        console.error('Error !!'); 
        return $q.reject(errResponse); 
       } 
0

बस कैसे गतिशील रूप से हर पोस्ट अनुरोध करने के लिए "सामग्री-प्रकार" शीर्ष लेख का एक उदाहरण दिखाने के लिए। यदि मैं क्वेरी स्ट्रिंग के रूप में पोस्ट पैराम पास कर रहा हूं, तो यह ट्रांसफॉर्मरवेस्ट का उपयोग करके किया जाता है। इस मामले में इसका मान एप्लिकेशन/एक्स-www-form-urlencoded है।

// set Content-Type for POST requests 
angular.module('myApp').run(basicAuth); 
function basicAuth($http) { 
    $http.defaults.headers.post = {'Content-Type': 'application/x-www-form-urlencoded'}; 
} 

फिर अनुरोध विधि में इंटरसेप्टर से पहले config वस्तु

// if header['Content-type'] is a POST then add data 
'request': function (config) { 
    if (
    angular.isDefined(config.headers['Content-Type']) 
    && !angular.isDefined(config.data) 
) { 
    config.data = ''; 
    } 
    return config; 
} 
1

लौट मामले में यह किसी को भी उपयोगी है। AngularJS के लिए 1.5x मैं सभी अनुरोधों के लिए CSRF सेट करने के लिए चाहता था और मैंने पाया कि जब मैं इस किया था: मैं मिल

$httpProvider.defaults.headers.common = { "Content-Type": "application/json"}; 

अन्यथा:

$httpProvider.defaults.headers.get = { 'CSRF-Token': afToken }; 
$httpProvider.defaults.headers.put = { 'CSRF-Token': afToken }; 
$httpProvider.defaults.headers.post = { 'CSRF-Token': afToken }; 

कोणीय सामग्री प्रकार हटाया तो मैं इस जोड़ने के लिए किया था एक 415 मीडिया प्रकार त्रुटि।

तो मैं इस सभी अनुरोधों के लिए अपने आवेदन कॉन्फ़िगर करने के लिए कर रहा हूँ:

angular.module("myapp.maintenance", []) 
    .controller('maintenanceCtrl', MaintenanceCtrl) 
    .directive('convertToNumber', ConvertToNumber) 
    .config(configure); 

MaintenanceCtrl.$inject = ["$scope", "$http", "$sce", "$window", "$document", "$timeout", "$filter", 'alertService']; 
configure.$inject = ["$httpProvider"]; 

// configure the header tokens for CSRF for http operations in this module 
function configure($httpProvider) { 

    const afToken = angular.element('input[id="__AntiForgeryToken"]').attr('value'); 

    $httpProvider.defaults.headers.get = { 'CSRF-Token': afToken }; // only added for GET 
    $httpProvider.defaults.headers.put = { 'CSRF-Token': afToken }; // added for PUT 
    $httpProvider.defaults.headers.post = { 'CSRF-Token': afToken }; // added for POST 

    // for some reason if we do the above we have to set the default content type for all 
    // looks like angular clears it when we add our own headers 
    $httpProvider.defaults.headers.common = { "Content-Type": "application/json" }; 

} 
संबंधित मुद्दे