使用 AJAX 发送 HTTP 跨域请求

Posted

技术标签:

【中文标题】使用 AJAX 发送 HTTP 跨域请求【英文标题】:Sending HTTP cross-domain request with AJAX 【发布时间】:2014-11-24 03:37:40 【问题描述】:

我正在尝试使用 AJAX 的 PUT 方法发送 HTTP 跨域请求。

为此,我正在使用这个:

$.ajax(
    url: ipv6Nodo+"/config?param=led",          
    crossDomain: true,
    type: 'PUT',
    data: "ls=ON",
    success: function(data) 
        // Do something with the result
        console.log(data);
    
);

我在中间嗅探,我发现我真的在使用 OPTIONS 方法发送请求。这不是问题,因为在服务器上我可以类似地接受 PUT 或 OPTIONS。问题是payload请求是空的,没有ls=ON,我怎么想要。如果我将此请求发送到同一个域,我可以看到有效负载。有什么问题?

提前致谢

【问题讨论】:

“抛出请求”?? 他们首先提出一个选项请求,询问是否允许 PUT。您不应该处理选项请求... 【参考方案1】:

与Cross Origin Resource Sharing 一起使用的OPTIONS 请求没有负载。这是一个“预检”请求,以确定服务器是否允许来自您的来源的 CORS。使用正确的 CORS 标头响应 OPTIONS 请求后,您将获得带有数据的 PUT 请求。

查看链接了解详情,但基本上:

浏览器发送带有 CORS 请求标头的 OPTIONS。 服务器决定是否可以接受来自该来源的请求,如果可以,则使用适当的 CORS 响应标头进行响应。 浏览器以实际的PUT 响应。

这对您的客户端 ajax 代码(但不是您的服务器代码)是透明的。

【讨论】:

所以如果我在服务器上启用 CORS,我应该能够发送 PUT 请求 如果您使用的是correctly supports CORS 的浏览器,可以。所以,不是 IE8 或 IE9,它支持它,而是通过一个特殊的 XDomainRequest 对象而不是 XMLHttpRequest,jQuery 无法解决的浏览器不一致问题(尽管如果你搜索,你可以找到代码来做到这一点)。 你能告诉我来自服务器的 CORS 响应如何吗?我知道它必须有标题Access-Control-Allow-Origin:,但我不知道其余的应该怎么做。基本上我想知道它是 HTTP/1.1 200OK 还是类似的。 它必须是 HTTP 204 无内容。感谢您的帮助!

以上是关于使用 AJAX 发送 HTTP 跨域请求的主要内容,如果未能解决你的问题,请参考以下文章

xmpp js端跨域请求

转载Ajax JS 跨域请求

SpringMVC-跨域请求

发送带有自定义 HTTP 标头的跨域请求时禁用预检 OPTION 请求

HTTP跨域时为何要发送options请求

聊聊Ajax跨域