如果标头已设置为默认值,则似乎没有任何方法可以在单个请求中跳过它。 设置null
或undefined
没有任何作用。
你能提供一些显示这种行为的代码示例吗? 您要取消设置什么默认标头?
如果我设置了axios.defaults.headers.common['Content-Type'] = 'application/json'
,则无法为单个请求取消设置该标头,我只能将其设置为另一个值。
你是如何尝试取消设置标题的? 使用这样的东西?
axios.request('/path', {
headers: {
'Content-Type': null
}
});
是的。 那没有用
抱歉,我错过了示例中的method
。 可能是什么让它不起作用?
我也试过设置方法。 我怀疑这与Object.assign()
某处有关,只是没有注意undefined
值。
@tyrsius您使用的是什么版本的 axios? 我刚刚写了一个测试来尝试重现这个并且它通过了。 我想知道这是否可能已在较新的版本中修复。
供参考,这是我的测试:
it('should remove default headers when config indicates', function (done) {
var instance = axios.create();
instance.defaults.headers.common['Content-Type'] = 'application/json';
instance.post('/foo/bar/', {
firstName: 'foo',
lastName: 'bar'
}, {
headers: {
'Content-Type': null
}
});
getAjaxRequest().then(function (request) {
testHeaderValue(request.requestHeaders, 'Content-Type', null);
done();
});
});
我也有这个问题。
我正在尝试从“common”中删除标题“Authorization”,但我发现使其工作的唯一方法是从 axios.defaults.header 中删除该属性,发出请求,然后将该属性添加回来再次。
修复此错误后,这将更容易
这对我来说也是一个问题(使用 axios v0.14.0),特别是对于使用Access-Control-Allow-Headers
端点,在这种情况下,我需要确保某些标头根本不随请求一起发送。
我使用的是 15.2 版,何时使用
headers: {
'Content-Type': null
}
它确实将标头值设置为空。 但我真的需要完全删除标题名称。
例如,当使用 s3 并生成预先签名的 url 以将文件发布到存储桶时,您不能有 Authenticate 标头。 但我有一个默认的授权集,因为我的绝大多数请求都需要它用于我自己的 api。
我解决这个问题的方法是执行以下操作
var instance = axios.create();
instance.defaults.headers.common = {};
instance.put(signedUrl, file, {headers: {'Content-Type': file.type}})
.then(function (result) {
console.log(result);
})
.catch(function (err) {
console.log(err);
});
编辑:这不能按预期工作。 问题是当你清除标题时
instance.defaults.headers.common = {};
它在全球范围内将其删除。 这将使我注销,因为我使用 Auth 标头。
为了解决这个问题,直到有更好的方法来处理全局配置,我在每次调用时都传递所需的标头,这并不理想。
我有同样的问题,但解决了
delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove
我有@SepiaGroup 的确切情况
我试图用null
和''
覆盖它,但随后 AWS 将null
视为我的授权并抱怨。
我试图从实例中删除它,但随后我的授权被全局删除,所以我在自己的服务器上得到 403。
我想我的解决方法是为此使用旧的XHR
,但这让我很难过:(
+1 还坚持无法清除特定呼叫的默认标头。
+1
+1
我也在最新版本 (0.16.2) 中看到了这种行为。 悲伤随之而来:(
删除它
delete instance.defaults.headers.common.Authorization
````
the way below is not working.
----
I think we could create a logout method that recreate the axios instance to replace the old one.
让实例 = axios.create({options})
功能:注销(){
实例 = axios.create({options})
}
``
@lzp4ever在大多数情况下都可以工作,我希望。 但是,如果有人添加了请求和响应拦截器,或者除了简单地传入配置选项之外,还对实例进行了更多配置,您的方法是否需要重做所有这些?
只是想知道@axelgenus的解决方案是否更
能够在不删除属性的情况下不发送默认标头会很好:)
+1
+1
+1。 您无法删除实例的标头,这确实令人难过。 这意味着所有实例都有对全局变量的引用。
+1
+1
+1 请修复此问题。
+1
+1
+1
我们遇到了同样的问题。 我们构建的大多数前端应用程序都需要使用多个 Rest Web 服务。 无法选择退出安全标头对我们来说是一个大问题。
+1
+1
在特定的请求对象上尝试这些家伙,以及标题、数据和方法:
transformRequest(data, headers) {
delete headers.common.Authorization;
return data;
}
试试这个,它解决了我的问题:
删除 axios.defaults.headers.common["授权"]; // 并创建您自己的标题
@mukeshyadav该解决方案已在此线程中多次提及。
重点是这不一定是理想的解决方案。 想象一个场景,您已将自己的自定义请求/响应拦截器添加到 Axios 实例,但您希望一个特定请求不包含其他地方使用的标头,您必须删除标头并在之后重新添加请求完成。
相反,想知道是否有一种方法可以相对轻松地简单地复制 Axios 实例以用于这些类型的一次性案例。
+1
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
为我工作
@aaronatmycujoo这似乎是这里最性感的解决方案。 尽管如此,想知道删除这样的标头是否会将其从链上更远的 Axios 实例中删除。 可能必须创建headers
或其他东西的深层副本。
我得测试一下。
据我所知,它没有。 尽管可能存在我没有触发的边缘情况
@SepiaGroup您不需要在整个请求中添加标头...这样做:
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;
在请求的标头中,您只会看到“application/json”
+1 感谢@axelgenus 你的解决方案有效
+1
@aaronatmycujoo FTW!!! 他的解决方案就像一个魅力...... ty!
尝试将文件上传到 S3 时遇到同样的问题(仅允许一种身份验证机制)。
尝试了@SepiaGroup的解决方案,但它也为以下所有实例全局删除了 auth 标头:(
@aaronatmycujoo这个解决方案非常适合我! 🎉
谢谢你们拯救了我的一天!
+1
+1
+1
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;
对我很有用!!!
不确定这是否是常识,但有一组“禁止标题” ,无法删除。
Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Date
DNT
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
Via
类型错误:无法将未定义或空值转换为对象
delete axios.defaults.headers.cummon["Authorization"];
你有一个错字@putu-eka-mulyana,我认为这是报告此类问题的错误地方。
delete axios.defaults.headers.common["Authorization"];
+1,从内容类型中删除字符集
+1,仅删除一个请求的 Auth 标头,在不显式删除的情况下接收请求配置对象,只需传递一些值,如 undefined 或 null
+1,仅删除一个请求的 Auth 标头,在不显式删除的情况下接收请求配置对象,只需传递一些值,如 undefined 或 null
我在 PUT 请求之前有一个 OPTION 请求,所以@aaronatmycujoo的 transformRequest 解决方案适用于我的 OPTION 请求,但 Authorization 标头仍然应用于我的 PUT 请求。
最终,我最终为 auth 与公共请求创建了单独的实例,因此我的 auth 标头仅应用于 auth 实例。
// do not configure auth header
export const publicAxios = axios.create(...)
// configure auth header
export const authAxios = axios.create(...)
// no auth header present for public instance
publicAxios.put(...)
@codeclown 的 @rizen PR #1845 将允许通过传递null
来取消设置标头。 这能解决问题吗?
@codeclown 的 @rizen PR #1845 将允许通过传递
null
来取消设置标头。 这能解决问题吗?
是的
多么漫长的旅程。 希望#1845 尽快合并。
transformRequest: [(data, headers) => { delete headers.common.Authorization return data }]
来自 axios 文档:
我遇到了类似的情况,但有一个 GET 请求:
Authorization: Bearer mytoken
重定向到 AWS S3 端点。 重定向 URL 附加了一个查询字符串: X-Amz-Signature=blahblahblah
。
AWS S3 拒绝调用,因为两个身份验证:
Authorization bearer token
X-Amz-Signature=blahblahblah
transformRequest
、 transformResponse
、 axios.interceptors.request
、 axios.interceptors.response
似乎都不能让我将自己注入进程并在点击重定向到 AWS S3 - 大概如果我可以在重定向后进入,我可以做一些事情来影响delete headers.Authorization
。
与请求 api/postman/etc 的调用相同。
这是一个丑陋的低效蒸汽 POS ......但它“有效™”。 我现在可以获得风险投资吗?
let retry = false;
await axios({
method: 'get',
url: "http://www.saasserviceprovider.com/notpublicapi",
headers: {
'Authorization': "Bearer mytoken",
}
})
.then((r) => {
//return successful
})
.catch ((e) => {
if (e.request.res.responseUrl.match(/s3.amazonaws.com/)) {
retry = e.request.res.responseUrl;
} else {
//log error
}
})
//Retry
if (retry) {
await axios.get(retry)
.then((r) => {
//return successful
}
})
.catch((e) => {
//log error
})
}
说真的……必须是更好的方式(在 axios 内)
我遇到了类似的情况,但有一个 GET 请求:
- GET http://www.saasserviceprovider.com/notpublicapi标题为
Authorization: Bearer mytoken
- 重定向到 AWS S3 端点。 重定向 URL 附加了一个查询字符串:
X-Amz-Signature=blahblahblah
。- AWS S3 拒绝调用,因为两个身份验证:
- 标题:
Authorization bearer token
- 查询字符串:
X-Amz-Signature=blahblahblah
transformRequest
、transformResponse
、axios.interceptors.request
、axios.interceptors.response
似乎都不能让我将自己注入进程并在点击重定向到 AWS S3 - 大概如果我可以在重定向后进入,我可以做一些事情来影响delete headers.Authorization
。与请求 api/postman/etc 的调用相同。
说真的……必须是更好的方式(在 axios 内)
@iyerusad你有没有找到比你的解决方法更好的方法? 我面临同样的问题,令人沮丧的是我似乎无法拦截重定向并删除授权标头,仅用于该后续/重定向请求(在这种情况下为亚马逊)🤔
@iyerusad你有没有找到比你的解决方法更好的方法? 我面临同样的问题,令人沮丧的是我似乎无法拦截重定向并删除授权标头,仅用于该后续/重定向请求(在这种情况下为亚马逊)🤔
不是真的 - 从下面使用选项B .。
_我评估的选项:_
A.采用替代包装器/客户端(例如 fetch api? request? request 似乎有效,但显然已被弃用)。 这可能是最干净的选项,但意味着切换到另一个 http 客户端语法。
B.将我的解决方法包装到一个函数中,并将该函数用于我知道遇到此问题的请求 - 丑陋的看似效率较低但目前正在使用它。
C.希望我是个白痴,错误地使用 axios 并且使用 axios 有更明智的解决方法。
D. Axios 得到修复/补丁?
@mikhoq @iyerusad您介意打开一个新问题来跟踪您的问题吗? 因为它与当前的不同,可能已在 #2844 中修复。
没问题 - 打开 #2855。
@mikhoq如果您有公共复制端点,请在那里添加评论。
那么显然transformRequest
被调用GET
请求? 我试过了,它奏效了,它只删除了当前请求的标头。
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
但是文档说
//
transformRequest
允许在请求数据发送到服务器之前对其进行更改
// 这仅适用于请求方法 'PUT'、'POST'、'PATCH' 和 'DELETE'
这让我觉得transformRequest
不会被GET
请求调用,但确实如此。 那么这条线到底是什么意思呢?
“这仅适用于请求方法 'PUT'、'POST'、'PATCH' 和 'DELETE'”
也许,“这可能只对……有用……”……? 这是误导海事组织。
这有效:
标题:{
'内容类型':'应用程序/json',
'授权':空,
}
尝试设置{ headers: { 'Content-Type' = null } }
没有成功,
所以要添加到@axelgenus有用的评论,我不得不更进一步:
import Axios from 'axios'
const client = Axios.create({
// ...
transformRequest: [(data, headers) => {
// add required "Content-Type" whenever body is defined
if (data) headers['Content-Type'] = 'application/x-www-form-urlencoded'
return data
}],
})
// completely remove "Content-Type" from instance by default
delete client.defaults.headers.common['Content-Type']
delete client.defaults.headers.post['Content-Type']
delete client.defaults.headers.put['Content-Type']
delete client.defaults.headers.patch['Content-Type']
// ...
用例是为Bitstamp API V2身份验证方法实现请求层。
最有用的评论
为我工作