交叉呼叫与Post合作,但在飞行前失败



我必须从我的网站向第三方域/服务器进行web服务调用。当我使用内容类型为text/plain的jQueryAjax by Post方法进行此调用时,它运行良好。

但是,当我将其更改为内容类型:text/xml时,它正在抛出:

对飞行前请求的响应未通过访问控制检查:否请求的上存在"Access Control Allow Origin"标头资源

甚至它设置在第三方服务器上,允许访问我们的网站。我们在进行内容类型为text/plain的调用时得到了这个标头。

我们还在第三方服务器上添加了以下内容。

Access-Control-Allow-Methods : Get , Post , Options ,PUT
Access-Control-Allow-Headers: Authorization,origin, content-type, accept

请让我知道飞行前请求没有得到"访问控制允许来源"响应的原因是什么?

脚本之所以适用于text/plain,是因为它是一个简单的请求。如果您查看这个答案,您可以看到您的文本/纯文本请求符合简单请求的要求。但是,当您将内容类型更改为text/xml时,它会将其更改为"非简单"请求。

为了让你的"非简单"请求生效,你需要研究如何提出飞行前请求。本网站在"处理不那么简单的请求"中解释了如何做到这一点。

更新

请注意:Access-Control-Allow-Methods是区分大小写的(全部大写),您不需要列出用于简单请求(GET、HEAD、POST)的任何方法源

Access-Control-Allow-Methods: OPTIONS, PUT
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept

Firefox在同源请求中不包含Origin头。但Chrome和Safari在同源POST/PUT/DELETE请求上包含Origin标头(同源GET请求将没有Origin标头)。

有没有可能起源相同?

您的缓存可能有问题吗?

确保您的jquery ajax调用具有以下设置:

crossDomain: true // Will force a cross domain request
cache: false

content-type:text/plaincontent-type: text/xml之间的区别在于:"text/xml"需要"preflight",而"text/plain"不需要。

来自MDN:

特别是,如果出现以下情况,请求将被预触发:

它使用GET、HEAD或POST以外的方法。此外,如果使用POST发送内容类型不是的请求数据application/x-www-form-urlencoded、multipart/form-data或text/plain,例如,如果POST请求使用application/xml或text/xml,则该请求将被预先触发。

可能导致飞行前请求失败的一些潜在原因:

  1. 服务器未启用CORS。搜索如何为您的服务器技术启用CORS
  2. 服务器不使用"text/plain"以外的请求。例如Spring有一个consume选项,用于定义可接受的内容类型
  3. 你的帖子中有一个"授权"的标题。如果使用凭据发送请求,则还应添加Access-Control-Allow-Credentials: true标头。再次来自MDN

相关内容

  • 没有找到相关文章

最新更新