使用Ajax,您如何在域中触发和忘记

时间:2012-10-22 20:12:54

标签: jquery ajax cross-domain

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

而且,您甚至可以通过处理loaderror事件来获取一些信息。当然,如果响应不是图像,则会调用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,因为就浏览器而言,你现在在同一个域上发出请求