Почему я получаю запрос OPTIONS вместо запроса GET? - PullRequest
260 голосов
/ 10 августа 2009
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
     alert(data);
});
</script>

он выполняет запрос OPTIONS к этому URL, а затем обратный вызов никогда не вызывается ни с чем.

Если это не междоменный домен, он работает нормально.

Разве jQuery не должен просто сделать вызов с <script> узлом, а затем сделать обратный вызов при его загрузке? Я понимаю, что не смогу получить результат (так как он междоменный), но это нормально; Я просто хочу, чтобы звонок прошел. Это ошибка или я что-то не так делаю?

Ответы [ 9 ]

235 голосов
/ 23 октября 2012

Согласно MDN ,

Предварительно просвечиваемые запросы

В отличие от простых запросов (обсуждаемых выше), «предварительные» запросы сначала отправить заголовок запроса HTTP OPTIONS ресурсу на другом домен, чтобы определить, является ли фактический запрос безопасным для Отправить. Межсайтовые запросы предварительно просматриваются так, поскольку они могут иметь последствия для пользовательских данных. В частности, запрос предварительно просвечивается, если:

  • Он использует методы, отличные от GET или POST. Также, если для отправки используется POST запрашивать данные с Content-Type, отличным от application / x-www-form-urlencoded, multipart / form-data или text / plain, например если запрос POST отправляет полезную нагрузку XML на сервер, используя application / xml или text / xml, тогда запрос предварительно просвечивается.
  • Устанавливает пользовательские заголовки в запросе (например, запрос использует заголовок, такой как X-PINGOTHER)
88 голосов
/ 24 августа 2009

ОПЦИИ от http://www.w3.org/TR/cors/ См. http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/ для получения дополнительной информации

5 голосов
/ 06 апреля 2017

Если вы пытаетесь POST

Обязательно JSON.stringify данные формы и отправьте как text/plain.

<form id="my-form" onSubmit="return postMyFormData();">
    <input type="text" name="name" placeholder="Your Name" required>
    <input type="email" name="email" placeholder="Your Email" required>
    <input type="submit" value="Submit My Form">
</form>

function postMyFormData() {

    var formData = $('#my-form').serializeArray();
    formData = formData.reduce(function(obj, item) {
        obj[item.name] = item.value;
        return obj;
    }, {});
    formData = JSON.stringify(formData);

    $.ajax({
        type: "POST",
        url: "https://website.com/path",
        data: formData,
        success: function() { ... },
        dataType: "text",
        contentType : "text/plain"
    });
}
2 голосов
/ 11 августа 2009

Я не верю, что jQuery естественным образом выполнит запрос JSONP, когда ему будет предоставлен такой URL. Однако он выполнит запрос JSONP, когда вы сообщите ему, какой аргумент использовать для обратного вызова:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
     alert(data);
});

Это полностью зависит от принимающего скрипта, чтобы использовать этот аргумент (который не должен называться "jsoncallback"), поэтому в этом случае функция никогда не будет вызываться. Но, поскольку вы заявили, что просто хотите, чтобы скрипт на metaward.com выполнялся, он бы это сделал.

1 голос
/ 21 февраля 2018

У меня была такая же проблема. Мое исправление заключалось в добавлении заголовков в мой PHP-скрипт, которые присутствуют только в среде разработчика.

Это позволяет междоменные запросы:

header("Access-Control-Allow-Origin: *");

Это говорит предварительному запросу, что клиент может отправлять любые заголовки, которые ему нужны:

header("Access-Control-Allow-Headers: *");

Таким образом, нет необходимости изменять запрос.

Если у вас есть конфиденциальные данные в вашей базе данных разработчиков, которые могут быть утечки, вы можете подумать об этом дважды.

1 голос
/ 22 сентября 2017

Просто измените "application / json" на "text / plain" и не забудьте JSON.stringify (request):

var request = {Company: sapws.dbName, UserName: username, Password: userpass};
    console.log(request);
    $.ajax({
        type: "POST",
        url: this.wsUrl + "/Login",
        contentType: "text/plain",
        data: JSON.stringify(request),

        crossDomain: true,
    });
1 голос
/ 10 августа 2009

На самом деле междоменные запросы AJAX (XMLHttp) не разрешены по соображениям безопасности (подумайте о том, чтобы извлечь «ограниченную» веб-страницу со стороны клиента и отправить ее обратно на сервер - это было бы проблемой безопасности) .

Единственный обходной путь - обратные вызовы. Это: создание нового объекта сценария и указание src на конечный JavaScript, который является обратным вызовом со значениями JSON (myFunction ({data}), myFunction - это функция, которая что-то делает с данными (например, хранит их) в переменной).

0 голосов
/ 12 ноября 2018

В моем случае проблема не была связана с CORS, так как я выдавал jQuery POST для того же веб-сервера. Данные были в формате JSON, но я пропустил параметр dataType: 'json'.

У меня не было (и я не добавил) параметра contentType, как показано в ответе Дэвида Лопеса выше.

0 голосов
/ 10 августа 2009

Похоже, что Firefox и Opera (также протестированные на Mac) не любят кросс-доменный характер (но Safari вполне подойдет).

Возможно, вам придется вызвать локальный серверный код, чтобы свернуть удаленную страницу.

...