Почему я получаю запрос OPTIONS вместо запроса GET?


<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>

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

когда это не кросс-домен, он отлично работает.

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

8 229

8 ответов:

по данным MDN,

Preflighted просит

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

  • он использует методы, отличные от GET или POST. Кроме того, если почта используется для отправки запрашивать данные с типом контента, отличным от применение/х-www-формы-urlencoded, multipart/данные формы, или обычный текст, например, если запрос POST отправляет полезную нагрузку XML на сервер с помощью application / xml или text / xml, затем запрос предварительно подсвечивается.
  • он устанавливает пользовательские заголовки в запросе (например, запрос использует заголовок, такой как X-PINGOTHER)

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

если ты хочешь 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"
    });
}

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

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

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

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

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

просто измените "application/json" на "text / plain" и не забывайте JSON.stringify (запрос):

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,
    });

похоже, что Firefox и Opera (также протестированы на mac) не любят перекрестную доменность этого (но Safari это нормально).

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

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

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

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

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

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

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

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