我想对 Web 服务进行一次即发即弃的 jQuery 调用。
基本上,我想发送一个 JSON 对象到http://myservice.com/uservisits/create
并且我不在乎接收任何类型的返回响应。但是,我们希望对我们的几个域使用相同的服务,这意味着要面对与 Ajax 相关的跨域限制。
你怎么做到这一点?JSONP 之类的有很多,但我不需要处理响应。我觉得我错过了一个明显的细节。
我想对 Web 服务进行一次即发即弃的 jQuery 调用。
基本上,我想发送一个 JSON 对象到http://myservice.com/uservisits/create
并且我不在乎接收任何类型的返回响应。但是,我们希望对我们的几个域使用相同的服务,这意味着要面对与 Ajax 相关的跨域限制。
你怎么做到这一点?JSONP 之类的有很多,但我不需要处理响应。我觉得我错过了一个明显的细节。
发送 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
文档。如果没有,您可能会找到一个可以做到这一点的插件。
您没有处理响应这一事实不会影响您面临的相同来源策略问题。但是,您将控制服务的所有消费者这一事实开启了使用CORS的可能性。但是,并非所有浏览器都支持 CORS。请参阅浏览器兼容性图表。如果您需要支持其他浏览器,您仍然必须使用 JSONP。
您不想要任何数据的事实实际上是无关紧要的,您仍然面临相同的跨域问题。有两种方法可以去...
1)您可以使用 jsonp(它实际上发出一个 get 请求)来发送数据,尽管这感觉有点混乱,因为您应该尝试使用 http 动词来表达他们的意图(即 GET 应该检索数据)。
2)您可以使用ARR(IIS中的应用程序请求路由)来基本重写请求。因此,您将为每个域设置一个规则以具有重写规则,例如 www.mydomain.com/webcall 路由到http://myservice.com/uservisits/create其中 mydomain.com 是启动 ajax 调用的域。如果您这样做,那么您可以以正常方式使用 ajax,因为就浏览器而言,您现在正在同一个域上发出请求