Jquery 使用Ajax,如何跨域激发和遗忘

Jquery 使用Ajax,如何跨域激发和遗忘,jquery,ajax,cross-domain,Jquery,Ajax,Cross Domain,我想对web服务进行fire and forget jQuery调用 基本上,我想向http://myservice.com/uservisits/create和我不想收到任何形式的回复。但是,我们希望在几个域中使用相同的服务,这意味着要面对与Ajax相关的跨域限制 你是怎么做到的?关于JSONP之类的东西有很多,但我不需要处理响应。我觉得我遗漏了一个明显的细节。事实上,你不想要任何数据回来是无关紧要的,你仍然面临着同样的跨域问题。你可以走两条路 1) 您可以使用jsonp(它实际上发出get请

我想对web服务进行fire and forget jQuery调用

基本上,我想向
http://myservice.com/uservisits/create
我不想收到任何形式的回复。但是,我们希望在几个域中使用相同的服务,这意味着要面对与Ajax相关的跨域限制


你是怎么做到的?关于JSONP之类的东西有很多,但我不需要处理响应。我觉得我遗漏了一个明显的细节。

事实上,你不想要任何数据回来是无关紧要的,你仍然面临着同样的跨域问题。你可以走两条路

1) 您可以使用jsonp(它实际上发出get请求)跨网络发送数据,尽管这感觉有点混乱,因为您应该尝试使用http动词来实现它们的意图(即get应该检索数据)


2) 您可以使用ARR(IIS中的应用程序请求路由)基本上重写请求。因此,您需要为每个域设置一个重写规则,例如:www.mydomain.com/webcall路由到mydomain.com是启动ajax调用的域。如果您这样做,那么您可以以正常方式使用ajax,因为就浏览器而言,您现在正在同一个域上发出请求

您没有处理响应的事实不会影响您所面临的同源策略问题。但是,您将控制服务的所有消费者这一事实打开了使用的可能性。但是,并非所有浏览器都支持CORS。如果您需要支持其他浏览器,您仍然必须使用JSONP。

发送http GET请求的最简单方法是使用图像信标:

var json = encodeURIComponent(JSON.stringify(obj));
new Image().src = "http://myservice.com/uservisits/create?JSON=" + json;
而且,您甚至可以通过处理
load
error
事件来获取少量信息。当然,如果响应不是图像,则将调用
错误
事件,而不是
加载
。您可以将服务设置为返回单像素图像以解决此问题

编辑:您可能更喜欢使用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");
var frame=$(“”)。hide();
frame.load(函数(){
var frameBody=frame.contents().find(“body”);
变量形式=$(“”{
行动:“http://myservice.com/uservisits/create",
方法:“员额”
});
形式。附录(框架体);
$("", {
名称:“json”,
值:json
}).附录(表格);
表单[0]。提交();
});
框架。附于(“主体”);

我认为jQuery已经内置了类似的东西。你可以试着翻阅文档。如果没有,你可能会找到一个插件来实现它。

不是重复的。提供的链接上写着“我需要抓取并解析之后的响应。”我不需要解析请求。对,但你可以这样做,只是不解析响应…@gilly3:关闭一个问题不会神奇地将其从搜索结果中删除。另外,我从来没有说过这是一个糟糕的问题,或者应该删除它,我只是简单地指出,我认为这是一个重复先前提出的问题。这个问题仍然是“周围”和可定位的,它肯定仍然有益于社区。我会将其归类在你发布的链接的第2项下。StackOverflow的一个不幸方面是,它强化了我们行业的一个方面,即欺负那些行业经验/知识/教育/声誉分数较低的人。一、 问题作者(即需要帮助的人)承认另一个问题有价值,但不相信它完全回答了我的问题。我与@Adam的交流表明了我的意思,我从他对我问题的后续澄清中获得了价值。也许你认为我应该能够从另一个问题中找出答案,但这真的是你的决定吗?结束一个不完全重复的问题的不幸方面是,无法为这个问题添加一个不适用于另一个问题的新答案。通过“使用JSONP”,你是说仅仅是数据类型:“JSONP”吗?如果没有回调,“使用JSONP”意味着什么?@John这意味着使用脚本元素注入。基本上,您所需要做的就是在页面上创建一个脚本元素,并将您想要点击的URL作为源。您的服务需要POST或GET请求吗?我可以构建该服务来接受这两种请求,尽管POST更能正确地标识正在执行的操作,而不是检索。GET会更容易。那么您所要做的就是使用数据类型jsonp。所以我只使用$.get(…数据类型:“jsonp”…),不包括回调,它会工作吗?是吗?虽然这可能是一种处理问题的好方法,但无法处理错误案例,因为OP似乎不关心可能没问题的响应。或者,您可以在image对象上设置“onError”处理程序,但无法将实际错误数据传回调用类,只能以这种方式处理一般错误。@FilmJ-当然。但是,这个问题是关于一个特定的案例,您不打算解析响应。图像信标方法非常适合这种情况。@FilmJ-此外,您在错误处理方面可能会非常有创意。1px×1px图像可能表示成功。任何其他图像大小都可能表示错误代码,可以通过大小进行解码。或者,一个错误信息甚至可以显示在结果图像中。所有给出的答案都很有用,我们对此表示感谢。从长远来看,我认为CORS是答案,但我今天还没有准备好。我将此标记为“答案”,因为它提供了一种巧妙的技巧(浏览器对图像的支持与时间一样古老)和一个iFrame解决方案,如果调用的服务是RESTful的,它将起作用。