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

上記はうまくいきますが、以下のajaxでPOSTを複製しようとすると500エラーが発生します。Ajax POSTと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." .... } 

この注目に値するが、クロスドメインであり、私はgitのを経由していdjango-crossdomainxhr-middleware.py使用しています:私が追加した場合要旨

をこのような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

ドキュメントを確認してください。url文字列にjsonオプションを設定する必要があります。 – Marcin

+0

'curl'リクエストヘッダとjQueryヘッダの間にdiffを投稿できますか? FirebugのコンソールタブにjQueryヘッダーが表示されます。 –

答えて

7

明示的curlにお電話であなたのコンテンツタイプを宣言されていますが、jQuery.ajax()コールで特定されていません。

コンテンツタイプがあることを行っている正確に定義するためにあなたのJavaScriptを更新します。

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

明快にするために、 'dataType'が何をしているのか言及できますか? –

+0

すでにこれを試していたが、上記のエラーメッセージが追加されていた。 –

+0

あなたはクロスドメインAJAX呼び出しを行っています。それはJSONでは機能しません。JSONPを使用する必要があります – Eduardo

3

のsettings.pyするXsSharing(https://gist.github.com/1164697)を追加します。

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

そして、AJAX呼び出しにするために、次のJavaScriptを使用します。

$.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呼び出しを無視して何もしません。"ありがとう –

関連する問題