首页 > 解决方案 > 为什么 Axios 在 PATCHing 到特定 URL 时不使用 Content-Type 标头并将请求方法转换为 GET?

问题描述

我使用 Axios 继承了一个代码库,否则我对该库不熟悉。这是一个 Node 应用程序,我正在尝试向第三方 API 发送 PATCH 请求。Axios 使用以下配置:

const axios = require('axios').create({
  baseURL: process.env.API_URL,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
  },
  auth: {
    username: process.env.API_USER,
    password: process.env.API_PW,
  },
});

然后我尝试发出以下 PATCH 请求:

const data = {
    fields: {
      field_a: 'yes',
      field_b: 'no',    
    },
  };

  try {
    const res = await axios.patch(`/user/${user.id}`, data, {
      headers: {
        'Content-Type': 'application/json'
      }
    });
    return res;
  } catch (err){
    console.error(err);
  }

据我所知,我只是在进行补丁调用时重新定义了 Content-Type 标头,但这只是试图解决这个问题。这两种方式都行不通。我在响应对象的 config 属性中看到的内容如下(大部分都被排除在外):

{
  headers: {
    Accept: "application/json"
    User-Agent: "axios/0.19.0"
  },
  method: 'patch',
}

查看同一响应对象的请求属性,我看到那里的方法被列为“GET”,其中 Content-Type 标头也没有列出。看起来好像 Content-Type 标头正在被剥离,并且方法正在更改为 GET。

如果我只更改 URL 目标/userWRONGPATH/${user.id},则按预期收到 404 响应,但响应对象的配置数据包括以下内容:

{
  headers: {
    Accept: "application/json"
    Content-Length: 105
    Content-Type: "application/json"
    User-Agent: "axios/0.19.0"
  }
}

响应对象的请求方法现在是预期的“PATCH”。如果这实际上是这里发生的事情,我不确定为什么补丁方法适用于其他路径。

标签: javascriptaxios

解决方案


您好,我认为问题可能与在 Axios 中再次发送标头有关,您定义了一个配置并将其添加到所有请求中。

这是我使用 axios 订购项目的示例。

// Axios custom config
const axiosInstance = axios.create({
  baseURL: urlBase,
  // timeout: 1000,
  headers: { 'Content-type': 'application/json' },
});


export const apiPatchRequest = (url, id, obj) => (
  axiosInstance.patch(`${url}/${id}`, obj)
);

推荐阅读