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

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

Если это не перекрестный домен, он отлично работает.

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

Ответ 2

Согласно 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)

Ответ 3

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

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

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

Ответ 4

Просто измените "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,
    });

Ответ 5

Он выглядит как Firefox и Opera (также проверенный на Mac) не нравится перекрестная доменность этого (но Safari в порядке с ним).

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

Ответ 6

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

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

Ответ 7

Если вы пытаетесь выполнить 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"
    });
}