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

上記は正常に機能しますが、以下のajaxでPOSTを複製しようとすると、500エラーが発生します。

$.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:gistで見つかった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
4

3 に答える 3

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"
});
于 2011-08-22T21:43:00.387 に答える
3

XS_SHARING_ALLOWED_HEADERSをミドルウェアに追加したところ、問題は解決しました。

https://gist.github.com/1164697

于 2011-08-23T08:56:38.257 に答える
3

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

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

次に、次のJavaScriptを使用して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実際の作成を行う別のリクエストを発行します。

于 2012-02-21T14:56:58.460 に答える