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

Это хорошо работает, но когда я пытаюсь воспроизвести POST в ajax ниже, я получаю 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." .... } 

Стоит отметить, что это кросс домен и я использую 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

Проверьте документы - вам может потребоваться установить опцию json в строке url. – Marcin

+0

Можете ли вы разместить разницу между заголовками запросов 'curl' и заголовками jQuery? Вы можете увидеть заголовки jQuery на вкладке консоли внутри Firebug. –

ответ

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

Добавить 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, который выполняет фактическое создание.

+0

Это: «Обратите внимание, что данные должны быть правильно сформированной строкой JSON, иначе jQuery будет молча игнорировать вызов ajax и ничего не делать», мне очень помогли! благодаря –

Смежные вопросы