2017-02-14 35 views
2

我正在尝试使用提取API来处理XML数据的POST以避免XmlHttpRequest的交叉来源问题。我面临的问题是,尽管将Content-Type设置为'text/xml'(在这种情况下是唯一受支持的内容类型标题),但是我的请求的内容类型正在重置为text/plain,导致HTTP状态为415请求的内容。使用提取API来发布XML

这是我取功能:

function doFetch(Content) 
    { 
     return fetch(
     URL, { method: 'POST', 
      mode: 'no-cors', 
      headers: new Headers(
      {'Content-Type': 'text/xml; charset=utf-8', 
      'Accept': '*/*', 
      'Accept-Language': 'en-GB', 
      'Accept-Encoding': 'gzip, deflate', 
      'Connection': 'Keep-alive', 
      'Content-Length': Content.length     
      }), 
      body: Content 
      }); 
    } 

内容是XML数据的字符串。

这是实际使用的标题:

Content-Length:1537 
    content-type:text/plain;charset=UTF-8 

只是想知道如果我想要做什么是可能的,如果是我做错了吗? (我对网络开发很陌生)。

谢谢!

回答

2

因为您为请求设置了mode: 'no-cors'(为什么?...),浏览器将不允许您设置除CORS-safelisted request-headers以外的任何请求标头。见the spec requirements

...如果后卫是 “request-no-cors” 和/不是CORS-safelisted request-header,回报。

设置Content-Type: text/xml; charset=utf-8使它不再是CORS安全列表的请求头;如果其值为application/x-www-form-urlencoded,multipart/form-datatext/plain,则Content-Type仅为CORS安全列表请求标头。

因此,此处解决方案的开始是不使用mode: 'no-cors'

它通常是有意义的设置mode: 'no-cors'的唯一情况是,如果你使用的服务人员用于缓存的响应,因为对于一个mode: 'no-cors'请求,浏览器不会让你的脚本接入响应的任何属性,所以只能你可以用它做的有用的事情就是缓存它。

我试图使用Fetch API来处理XML数据的POST以避免XmlHttpRequest的交叉源问题。

的提取API遵循相同的跨域请求模型XHR,因此目前还不清楚你会试图通过提取API,以避免...

+0

啊谢谢什么跨域问题。这解释了为什么它被改变了!交叉来源的问题是,我试图访问的资源没有任何处理OPTIONS请求的方法。出于某种原因,使用Internet Explorer 11和更早的版本允许我发送和接收没有问题,但任何'现代'浏览器,Edge,Chrome等给我一个HTTP 404响应,因为CORS问题。 – Krisisonfire