我想对Web服务进行即发即弃的jQuery调用。
基本上,我想将一个JSON对象发送到http://myservice.com/uservisits/create
并且我不关心接收任何类型的返回响应。但是,我们希望为我们的几个域使用相同的服务,这意味着要遇到与Ajax相关的跨域限制。
你是怎么做到的? JSONP上有很多这样的东西,但我不需要处理响应。我觉得我错过了一个明显的细节。
答案 0 :(得分:7)
发送http GET请求的最简单方法是使用图像信标:
var json = encodeURIComponent(JSON.stringify(obj));
new Image().src = "http://myservice.com/uservisits/create?JSON=" + json;
而且,您甚至可以通过处理load
和error
事件来获取一些信息。当然,如果响应不是图像,则会调用error
事件,而不是load
。您可以将服务设置为返回单个像素图像以解决此问题。
修改:您mentioned您可能更喜欢使用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
文档。如果没有,你可能会找到一个插件来实现它。
答案 1 :(得分:2)
您未处理响应的事实不会影响您所面临的相同原始策略问题。但是,您将控制该服务的所有消费者这一事实开启了使用CORS的可能性。但是,并非所有浏览器都支持CORS。 See the browser compatibility chart.如果您需要支持其他浏览器,则仍需使用JSONP。
答案 2 :(得分:1)
您不希望任何数据返回的事实实际上是无关紧要的,您仍然面临相同的跨域问题。有两种方法可以......
1)你可以使用jsonp(它实际上是一个get请求)发送数据虽然这会让你觉得有点乱,因为你应该尝试使用http动词来表达他们的意图(即GET应该检索数据)。
2)您可以使用ARR(IIS中的应用程序请求路由)基本上重写请求。因此,您需要为每个域设置一条规则,以使其具有重写规则,例如: www.mydomain.com/webcall路由到http://myservice.com/uservisits/create,其中mydomain.com是启动ajax呼叫的域。如果你这样做,那么你可以以正常的方式使用ajax,因为就浏览器而言,你现在在同一个域上发出请求