Почему я получаю запрос 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 ответов


по данным MDN,

Preflighted просит

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

  • он использует методы, отличные от GET или POST. Кроме того, если POST используется для отправки запрашивать данные с типом контента, отличным от application/x-www-form-urlencoded, multipart / form-data, or text/plain, например, если 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/ немного подробнее


если ты хочешь в должности

обязательно 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: *");

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

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

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

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