10

我想对 Web 服务进行一次即发即弃的 jQuery 调用。

基本上,我想发送一个 JSON 对象到http://myservice.com/uservisits/create并且我不在乎接收任何类型的返回响应。但是,我们希望对我们的几个域使用相同的服务,这意味着要面对与 Ajax 相关的跨域限制。

你怎么做到这一点?JSONP 之类的有很多,但我不需要处理响应。我觉得我错过了一个明显的细节。

4

3 回答 3

8

发送 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文档。如果没有,您可能会找到一个可以做到这一点的插件。

于 2012-10-22T20:23:39.263 回答
2

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

于 2012-10-22T20:17:59.833 回答
1

您不想要任何数据的事实实际上是无关紧要的,您仍然面临相同的跨域问题。有两种方法可以去...

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

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

于 2012-10-22T20:17:43.937 回答