Междоменный POST-запрос с использованием Cross-Origin Resource Sharing без получения данных обратно

Я отправляю данные через домен через запрос 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 () ... обработчик работает.

Итак, вопрос: что происходит (или нет) и почему? Я получаю данные в порядке, я просто хотел бы иметь возможность вернуть ответ.


Обновление : Это устраняет мою проблему в некоторых браузерах, но поскольку у меня нет полного определенного объяснения этого поведение Я оставляю его открытым .

Хорошо, я прочитал руководство и, насколько я понимаю, применяемый алгоритм примерно такой:

  1. Пользовательские агенты могут реализовать предварительную проверку вызов. Это запрос OPTIONS . Идея состоит в том, что они делают этот запрос, который дает им ответ относительно запрошенного ресурса, который они затем должны кэшировать. Я ' m не передает обратно поле max-age , поэтому я подозреваю, что пока возвращается успех и разрешен X-запрос, в кэше пользовательского агента нет ничего, что позволило бы мне сделать это, поэтому правила по умолчанию (изолировать request).
  2. Когда вы делаете фактический запрос, я полагаю, что пользовательский агент должен проверять предполетный кеш на предмет разрешений. Я считаю, что без поля максимального возраста он не может найти эти разрешения. Однако ответ с такими же заголовками на POST , похоже, позволяет Firefox и Google Chrome просматривать ответ. Опера не может. IE остается непроверенным на данный момент.

В настоящее время я не понимаю, и из руководства (по крайней мере, для меня) не ясно, должен ли запрос CORS также отвечать этими заголовками в запросе, а также ОПЦИИ . Я поэкспериментирую с заголовком Max-Age и посмотрю, что он позволяет, а что нет. Однако мне все еще не хватает определенного авторитетного понимания этого вопроса, так что, если здесь есть кто-то, кто знает, я все слышу.

13
задан 10 March 2011 в 11:50
поделиться