使用 AngularJS 在 Firefox 中更改请求标头时遇到问题

Posted

技术标签:

【中文标题】使用 AngularJS 在 Firefox 中更改请求标头时遇到问题【英文标题】:trouble changing request headers in Firefox with AngularJS 【发布时间】:2014-08-19 08:37:38 【问题描述】:

我的后端要求“Content-Type”请求标头完全是“application/json”。这是一个 CORS 请求,在 Chrome 中一切正常。确切的标题,来自开发者工具网络标签来源:

Content-Type: application/json

我在 AngularJS 中使用 $http.default.headers.post 进行了设置,它在 Chrome 中运行良好。但是它在 Firefox 中不起作用。 Firefox 会发送这个:

Content-Type: application/json; charset=UTF-8

我尝试通过以下方式更改标题:

设置 $http.default.headers(用于 .post、.common) 为一个请求设置自定义标头 使用 $http 拦截器

所有这些方法都适用于 Chrome,但不适用于 Firefox。 请求包含数据

如果我一起删除“Content-Type”标头,它仍然会被发送,但它是:

Content-Type: text/plain; charset=UTF-8

(Chrome 和 Firefox 都会出现这种情况)。

这让我认为浏览器强制标头:) 如何在 Firefox 中规避这个问题?

【问题讨论】:

来自我的愚蠢问题:你不能让你的后端接受一个完全正常的 HTTP 标头吗?你永远不知道 Chrome 何时/是否突然决定也开始执行它。 后端不是我的——我使用的是 LimeSurvey RemoteControl API,它有点太敏感了。我可以在网络服务器中转换请求 - 我刚才做了,哪种解决了问题,但不是问题。 是的,我把它作为评论而不是出于这个原因的答案。 【参考方案1】:

Firefox 有 charset=UTF-8 hard-coded for string payloads。

但是,您可以发送 Blob 代替:

var r = new XMLHttpRequest();
r.open("POST", ...);
r.send(new Blob(
 [JSON.stringify(a:1)],
 type:"application/json"
));

这也适用于角度 $http XHR 包装器:

$http(
    method: "POST",
    url: "/echo/json",
    headers: 
        "Content-Type": "application/json"
    ,
    data: new Blob([JSON.stringify(
        a: 1
    )])
);

Fiddle

【讨论】:

感谢您的解释。我不想将它作为 Blob 发送,因为我似乎无法以这种方式利用 AngularJS。 感谢您提供有关硬编码的信息。快把我逼疯了:)

以上是关于使用 AngularJS 在 Firefox 中更改请求标头时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

CORS 适用于 chrome 但不适用于 firefox、angularjs

AngularJS 的 CORS 错误仅在 FireFox 中发布

AngularJS $http.get() 在 Chrome 中最多需要 10-20 秒,在 Firefox 中运行良好

FireFox的Angularjs CORS失败

Firefox 的 Roboto 字体更粗

带有 AngularJS 的 CSS3 动画在 Firefox 中不能正确滑动