Axios: 不要发送默认标头

创建于 2016-07-19  ·  64评论  ·  资料来源: axios/axios

如果标头已设置为默认值,则似乎没有任何方法可以在单个请求中跳过它。 设置nullundefined没有任何作用。

headers

最有用的评论

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

为我工作

所有64条评论

你能提供一些显示这种行为的代码示例吗? 您要取消设置什么默认标头?

如果我设置了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 标头。

为了解决这个问题,直到有更好的方法来处理全局配置,我在每次调用时都传递所需的标头,这并不理想。

545

我有同样的问题,但解决了

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 文档:

> 这仅适用于请求方法“PUT”、“POST”、“PATCH”和“DELETE”

我遇到了类似的情况,但有一个 GET 请求:

  1. GET http://www.saasserviceprovider.com/notpublicapi标题为Authorization: Bearer mytoken
  1. 重定向到 AWS S3 端点。 重定向 URL 附加了一个查询字符串: X-Amz-Signature=blahblahblah

  2. AWS S3 拒绝调用,因为两个身份验证:

    • 标题: Authorization bearer token
    • 查询字符串: X-Amz-Signature=blahblahblah

transformRequesttransformResponseaxios.interceptors.requestaxios.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 请求:

  1. GET http://www.saasserviceprovider.com/notpublicapi标题为Authorization: Bearer mytoken
  2. 重定向到 AWS S3 端点。 重定向 URL 附加了一个查询字符串: X-Amz-Signature=blahblahblah
  3. AWS S3 拒绝调用,因为两个身份验证:
  • 标题: Authorization bearer token
  • 查询字符串: X-Amz-Signature=blahblahblah

transformRequesttransformResponseaxios.interceptors.requestaxios.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身份验证方法实现请求层。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Shu-Ji picture Shu-Ji  ·  3评论

Adman picture Adman  ·  3评论

altruisticsoftware picture altruisticsoftware  ·  3评论

Spartano picture Spartano  ·  3评论

varmeh picture varmeh  ·  3评论