Используя Ajax, как вы стреляете и забываете по доменам

Я хочу сделать вызов jQuery для fire-and-forget для веб-службы.

В принципе, я хочу отправить объект JSON в http://myservice.com/uservisits/create и , я не хочу получать какой-либо ответ возврата. Тем не менее, мы хотим использовать одну и ту же услугу для нескольких наших доменов, что означает преодоление междоменных ограничений, связанных с Ajax.

Как вы это делаете? Там много на JSONP и тому подобное, но мне не нужно обрабатывать ответ. Я чувствую, что мне не хватает очевидной детали.

Ответ 1

Самый простой способ отправить запрос HTTP GET - с маяком изображения:

var json = encodeURIComponent(JSON.stringify(obj));
new Image().src = "http://myservice.com/uservisits/create?JSON=" + json;

И вы можете получить немного информации обратно, обработав события load и error. Конечно, если ответ не является изображением, будет вызываться событие error, а не load. Вы можете настроить службу для возврата одного пиксельного изображения, чтобы решить эту проблему.

Изменить: Вы упомянутые, вы можете использовать HTTP POST. Это не так просто, как маяк изображения, но вы можете сделать междоменную запись, используя скрытый iframe:

var frame = $("<iframe>").hide();
frame.load(function() {
    var frameBody = frame.contents().find("body");
    var form = $("<form>", {
        action: "http://myservice.com/uservisits/create",
        method: "POST"
    });
    form.appendTo(frameBody);
    $("<input/>", {
        name: "json",
        value: json
    }).appendTo(form);
    form[0].submit();
});
frame.appendTo("body");

Я думаю, что у jQuery уже есть что-то подобное. Вы можете попробовать выполнить поиск jQuery.ajax. Если нет, возможно, вы найдете плагин, который сделает это.

Ответ 2

Тот факт, что вы не обрабатываете ответ, не влияет на ту же самую проблему с исходной политикой, с которой вы сталкиваетесь. Но тот факт, что вы будете контролировать всех потребителей услуги, открывает возможность использования CORS. Однако не все браузеры поддерживают CORS. См. таблицу совместимости браузера. Если вам нужно поддерживать другие браузеры, вам все равно придется использовать JSONP.

Ответ 3

Тот факт, что вы не хотите, чтобы какие-либо данные были на самом деле неактуальны, вы по-прежнему сталкиваетесь с теми же проблемами с перекрестными доменами. Вы можете пойти двумя способами...

1) Вы можете использовать jsonp (который фактически делает запрос на получение), чтобы отправить данные, хотя это кажется немного грязным, поскольку вы должны пытаться использовать http-глаголы для своего намерения (то есть GET должен извлекать данные).

2) Вы можете использовать ARR (маршрутизацию запросов приложений в IIS), чтобы в основном переписать запрос. Таким образом, вы должны установить правило для каждого домена, чтобы иметь правило перезаписи, например. www.mydomain.com/webcall направляется в http://myservice.com/uservisits/create, где mydomain.com - это домен, в котором инициируется вызов ajax. Если вы это сделаете, вы можете использовать ajax в обычном режиме, поскольку в отношении браузера вы теперь делаете запросы в том же домене