2016-04-02 33 views
5

我必须从我的网站到第三方域/服务器进行Web服务呼叫。 虽然我正在使用内容类型为text/plain的Post方法使用jQuery Ajax进行此调用,并且它工作正常。跨邮电与邮政工作,但与飞行前失败

但是当我将其更改为内容类型:文本/ XML则抛出:

回应预检要求未通过访问控制检查:没有 “访问控制允许来源'标题出现在请求的 资源中。

即使它设置在第三方服务器上以允许访问我们的网站。我们正在使用content-type:text/plain进行调用时获取此标头。

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

Access-Control-Allow-Methods : Get , Post , Options ,PUT 

Access-Control-Allow-Headers: Authorization,origin, content-type, accept 

请让我知道什么可能是飞行前请求没有得到'Access-Control-Allow-Origin'作为响应的原因?

+0

我已将Soap服务更改为Rest服务,现在选项调用具有所有必需的control-access- *标头。我不知道Soap Call有什么问题。 – yashpal

回答

0

你的脚本为text/plain工作的原因是因为它是一个简单的请求。如果你看看this answer,你可以看到你的文本/普通请求符合简单请求的要求。但是,将内容类型更改为text/xml时,会将其更改为“非简单”请求。

为了使您的“非简单”请求起作用,您需要查看如何提出飞行前请求。 This website解释了如何在“处理非简单请求”下执行该操作。

更新

刚一说明: 的Access-Control-Allow-Methods铸造敏感(全部大写),并且你不需要列出用于简单的请求(GET,HEAD,POST)的任何方法。 - source

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标头)。

原点是否有可能相同?

请问您的caching有问题吗?

确保你有这些settings您的jQuery Ajax调用:

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

是的,我知道这是简单的要求,另一个是“不是那么简单的要求”。问题是,在一个请求我得到所有访问控制 - *标题,但在选项我没有得到这些头。所以我的“不是那么简单的请求”就失败了。 – yashpal

+0

@yashpal我已经更新了我的答案。 – GreeKatrina

0

content-type:text/plaincontent-type: text/xml之间的差别是: “文/ XML” 要求 “预检”,而是 “text/plain的” 没有。

MDN

它使用比GET,HEAD或POST的其它方法:

特别地,如果请求被预检。另外,如果POST使用 来发送具有除 application/x-www-form-urlencoded,multipart/form-data或text/plain之外的内容类型的请求数据,例如 。如果POST请求使用 application/xml或text/xml向服务器发送XML有效内容,则会预先显示该请求。

一些潜在的原因,那些能引起预检要求的故障:

  1. CORS没有被服务器启用。搜索如何为您的服务器技术启用CORS。
  2. 服务器不消耗“text/plain”以外的请求。例如; Spring有一个consume option,它定义了哪种内容类型可以接受。
  3. 您的帖子中有一个“授权”标题。如果您使用凭证发送请求,则还应该添加Access-Control-Allow-Credentials: true标题。再次来自MDN