我有一个移动网络应用程序,它通过 $.get() 发出 AJAX 请求。 Safari iOS 的请求成功,但 Chrome for iOS 的请求失败,状态为 0 且状态文本为“错误”。
在我的服务器上使用 tcpdump,我可以看到 Safari 发送/接收以下 header :
Accept: */* (outgoing)
Content-Type: text/plain;charset=ISO-8859-1 (returning)
iOS 版 Chrome 向传出的 Accept: header 添加了“image/webp”的 mime 类型,返回的 Content-Type 是“image/webp”:
Accept: */*,image/webp (outgoing)
HTTP/1.1 200 OK
Content-Type: image/webp (returning)
通读 jQuery 代码,看起来 $.get() 只解析 AJAX 响应中的某些内容类型,所以我认为图像 mime 类型只是被拒绝,导致“错误”状态。
在来自 iOS 版 Chrome 的请求到达我的服务器时,还有这个 header :
通过:1.1 Chrome-Compression-Proxy
...这表明 Chrome for iOS 已将请求发送到 Google 代理服务器以服务该请求(信息 https://support.google.com/chrome/answer/3517349?hl=en)。好像这个代理服务器正在设置额外的内容类型,并且在返回的路上以某种方式返回内容类型作为 image/webp?服务器代码是 RESTful Spring 3;我确实在 Controller 代码中将内容类型设置为“text/plain”,但不知何故,它没有被采用,它仍然作为“image/webp”返回。
有没有人遇到过类似的问题并找到了解决方案?我需要返回 Content-Type 为“text/plain”才能将数据正确返回到我的应用程序。此请求在 Android 版 Chrome 和 AFAIK 上均能正常工作,尚未为此执行 tcpdump,但该应用程序可正常工作;仅在 iOS 版 Chrome 上失败。
最佳答案
我们遇到了同样的问题:iOS 版 Chrome 更喜欢 webp,因此它发送其 header 作为 Accepts: image/webp, */*;q=0.8
。实现该更改的人员显然从未考虑过影响,因此这导致相当多的 API 返回 415
有关详细信息,请参阅:https://code.google.com/p/chromium/issues/detail?id=169182
最后我们修改了服务器本身,因为它会返回 415。在响应端,它应该一切顺利。
关于javascript - 为什么 Chrome for iOS 会插入 image/webp content-type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287347/