2011-08-22 17 views
8
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"latlong": "test"}' http://localhost:8000/geo/api/geolocation/ 

ऊपर काम करता है ठीक लेकिन जब मैं ajax में पोस्ट को दोहराने के लिए कोशिश नीचे मैं 500 त्रुटि मिलती है।अजाक्स पोस्ट और Django Tastypie

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:8000/geo/api/geolocation/', 
    data: '{"latlong": "test"}', 
    success: latlongSaved(), 
    dataType: "application/json", 
    processData: false, 
}); 

त्रुटि संदेश है:

{"error_message": "The format indicated 'application/x-www-form-urlencoded' had no available deserialization method. Please check your ``formats`` and ``content_types`` on your Serializer." .... } 

ध्यान देने योग्य बात यह क्रॉस डोमेन है और मैं django-crossdomainxhr-middleware.py Git के माध्यम से पाया उपयोग कर रहा हूँ वर्थ: सार

अगर मैं एक जोड़ने इस तरह ajax कॉल करने के लिए सामग्री प्रकार:

contentType: "application/json" 

मैं यह त्रुटि वापस पाने:

XMLHttpRequest cannot load http://localhost:8000/geo/api/geolocation/. Request header field Content-Type is not allowed by Access-Control-Allow-Headers. 
Request URL:http://localhost:8000/geo/api/geolocation/ 
Request Method:OPTIONS 
Status Code:200 OK 
Request Headersview source 
Access-Control-Request-Headers:Origin, Content-Type, Accept 
Access-Control-Request-Method:POST 
Origin:http://localhost:3000 
Response Headersview source 
Access-Control-Allow-Methods:POST,GET,OPTIONS,PUT,DELETE 
Access-Control-Allow-Origin:* 
Content-Type:text/html; charset=utf-8 
Date:Tue, 23 Aug 2011 07:59:49 GMT 
Server:WSGIServer/0.1 Python/2.6.1 
+0

दस्तावेज़ों की जांच करें - आपको यूआरएल स्ट्रिंग में जेसन विकल्प सेट करने की आवश्यकता हो सकती है। – Marcin

+0

क्या आप 'curl' अनुरोध शीर्षलेख और jQuery शीर्षलेख के बीच अंतर पोस्ट कर सकते हैं? आप फ़ायरबग के अंदर कंसोल टैब में jQuery शीर्षलेख देख सकते हैं। –

उत्तर

7

आप स्पष्ट रूप से curl करने के लिए अपने कॉल में अपने सामग्री प्रकार की घोषणा कर रहे हैं, लेकिन आप अपने jQuery.ajax() फोन पर विशिष्ट नहीं किया जा रहा है।

अद्यतन आपकी जावास्क्रिप्ट वास्तव में क्या सामग्री प्रकार होने जा रहा है परिभाषित करने के लिए:

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:8000/geo/api/geolocation/', 
    data: '{"latlong": "test"}', 
    success: latlongSaved(), 
    dataType: "application/json", 
    processData: false, 
    contentType: "application/json" 
}); 
+0

बस स्पष्टता के लिए आप उल्लेख कर सकते हैं कि 'डेटा टाइप' क्या करता है? –

+0

पहले से ही कोशिश की गई थी, ऊपर जोड़ा गया त्रुटि संदेश। –

+0

आप क्रॉस डोमेन AJAX कॉल कर रहे हैं। यह JSON के लिए काम नहीं करेगा, आपको JSONP – Eduardo

3

जोड़े XsSharing (https://gist.github.com/1164697) settings.py रहे हैं:

:

MIDDLEWARE_CLASSES = [ 
    ..., 
    'django-crossdomainxhr-middleware.XsSharing' 
] 

फिर एक ajax कॉल करने के लिए निम्नलिखित जावास्क्रिप्ट का उपयोग

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:8000/geo/api/geolocation/', 
    data: '{"latlong": "test"}', 
    success: latlongSaved(), 
    contentType:'application/json', 
    dataType: 'application/json', 
    processData: false, 
}); 

ध्यान दें कि data एक अच्छी तरह से गठित JSON स्ट्रिंग होना चाहिए, अन्यथा jQuery चुपचाप AJAX कॉल को अनदेखा कर देगा और कुछ भी नहीं करेगा।

दृश्यों के पीछे क्या है कि AJAX कॉल सबसे पहले OPTIONS /geo/api/geolocation/ भेज देगा। चूंकि प्रतिक्रिया हेडर XsSharing मिडलवेयर द्वारा संशोधित किया गया है, इसलिए jQuery एक और POST /geo/api/geolocation अनुरोध जारी करेगा जो वास्तविक निर्माण करता है।

+0

यह: "ध्यान दें कि डेटा एक अच्छी तरह से गठित JSON स्ट्रिंग होना चाहिए, अन्यथा jQuery चुपचाप AJAX कॉल को अनदेखा कर देगा और कुछ भी नहीं करेगा", मुझे बहुत मदद मिली! धन्यवाद –