Я отправляю данные через домен через запрос 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
. Идея состоит в том, что они делают этот запрос, который дает им ответ в отношении запрошенного ресурса, который они затем должны кэшировать. Я не передаю поле max-age, поэтому я подозреваю, что пока успех возвращается и разрешен X-запрос, в кэше пользовательского агента нет ничего, что позволило мне это сделать, поэтому применяются правила по умолчанию (изолировать запрос). - Когда вы делаете фактический запрос, я считаю, что пользовательский агент должен проверять кеш-память перед полетом для получения разрешений. Без моего поля максимального возраста я считаю, что он не находит эти разрешения. Однако ответ с теми же заголовками на
POST
позволяет Firefox и Google Chrome просматривать ответ. Опера не может. На данный момент IE остается непроверенным.
В настоящее время я не понимаю, и из руководства (по крайней мере, мне) неясно, должен ли запрос CORS также отвечать на эти заголовки в запросе, а также на OPTIONS
. Я буду экспериментировать с заголовком Max-Age
и посмотреть, что это разрешает или не позволяет. Тем не менее, мне все еще не хватает определенного авторитетного понимания по этому вопросу, поэтому, если кто-то здесь знает, я все уши.