Я отправляю данные между доменами через запрос POST, но ответ не работает, в частности, никогда не вызывается обработчик успеха jQuery.
Используемые материалы: Django, Apache, jQuery.
Итак, я настроил запрос, довольно похожий на этот:
$.ajax({
url: "http://somesite.com/someplace",
type: "POST",
cache: false,
dataType: "json",
data: { ... },
success: function( msg ) {
alert(msg);
},
});
Как вы хорошо знаете, CORS позволяет мне ответить на запрос OPTIONS
соответствующим образом, чтобы сказать "Да, вы можете отправить мне ".Что я и делаю.Firebug подтверждает, что я получаю свой код состояния 200
и что тип возвращаемого значения на самом деле application/json
.Тем не менее, Firebug также подтверждает, что обработчик успеха в приведенном выше примере не вызывается.
Для справки, мой ответ на OPTIONS
:
elif request.method == "OPTIONS":
response = HttpResponse("")
response['Access-Control-Allow-Origin'] = "*"
response['Access-Control-Allow-Methods'] = "POST, GET, OPTIONS"
response['Access-Control-Allow-Headers'] = "X-Requested-With"
return response
Внапротив, если я установлю обработчик complete: function()...
, он будет работать.
Итак, вопрос в том, что происходит (или нет) и почему?Я получаю данные в порядке, я просто хотел бы иметь возможность вернуть ответ.
Обновление : Это исправляет мою проблему в некоторых браузерах, но так как я неУ меня нет полного определенного объяснения этому поведению. Я оставляю его открытым .
Хорошо, поэтому я прочитал руководство и, насколько я понимаю, примененный алгоритмпримерно так:
- Пользовательские агенты могут реализовывать предполетный вызов.Это запрос
OPTIONS
.Идея состоит в том, что они делают этот запрос, который дает им ответ относительно запрошенного ресурса, который они затем должны кешировать. Я не возвращаю поле максимального возраста , поэтому я подозреваю, что пока возвращается успех и X-запрос разрешен, в кеше агента пользователя нет ничего, что позволило бы мне это сделать, поэтомуприменяются правила по умолчанию (изолировать запрос). - Когда вы делаете фактический запрос, я полагаю, что пользовательский агент должен проверять кэш перед полетом на предмет разрешений.Я полагаю, что без моего поля максимального возраста эти разрешения не найдены.Тем не менее, ответ с одинаковыми заголовками на
POST
, по-видимому, позволяет Firefox и Google Chrome просматривать ответ.Опера не может.IE остается непроверенным на данный момент.
В настоящее время я не понимаю, и из руководства неясно (по крайней мере для меня), должен ли запрос CORS также отвечать с этими заголовками в запросекак OPTIONS
.Я поэкспериментирую с заголовком Max-Age
и посмотрю, что это позволяет или не позволяет.Тем не менее, мне все еще не хватает определенного авторитетного понимания по этому вопросу, поэтому, если здесь есть кто-то, кто знает, я весь в ушах.