使用axios POST请求传递标头[ReactJS]

Jag*_*ati 83 json content-type http-post http-headers axios

我已经按照npm包文档中的建议编写了一个axios POST请求

var data = {
    'key1': 'val1',
    'key2': 'val2'
}
axios.post(Helper.getUserAPI(), data)       
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在我修改了我的后端API以接受Headers

内容类型:'application/json'

授权:'JWT fefege ......'

现在这个请求在POSTMAN上工作正常,但是在写一个axios调用时,我遵循这个链接并且不能让它工作.

我正在得到 400 BAD Request

这是我修改过的请求

axios.post(Helper.getUserAPI(), {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'JWT fefege...'
    },
    data
})      
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏

提前致谢.

Shu*_*tri 156

使用axios时,为了传递自定义标头,请提供包含标头作为最后一个参数的对象

修改你的axios请求

const headers = {
  'Content-Type': 'application/json',
  'Authorization': 'JWT fefege...'
}

axios.post(Helper.getUserAPI(), data, {
    headers: headers
  })
  .then((response) => {
    dispatch({
      type: FOUND_USER,
      data: response.data[0]
    })
  })
  .catch((error) => {
    dispatch({
      type: ERROR_FINDING_USER
    })
  })
Run Code Online (Sandbox Code Playgroud)


Mat*_*out 25

以下是带有自定义标头的axios.post请求的完整示例

var postData = {
  email: "test@test.com",
  password: "password"
};

let axiosConfig = {
  headers: {
      'Content-Type': 'application/json;charset=UTF-8',
      "Access-Control-Allow-Origin": "*",
  }
};

axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
.then((res) => {
  console.log("RESPONSE RECEIVED: ", res);
})
.catch((err) => {
  console.log("AXIOS ERROR: ", err);
})
Run Code Online (Sandbox Code Playgroud)


Lal*_*han 22

要在 Axios POST 请求中设置标头,请将第三个对象传递给axios.post()调用。

const token = '..your token..'

axios.post(url, {
  //...data
}, {
  headers: {
    'Authorization': `Basic ${token}` 
  }
})
Run Code Online (Sandbox Code Playgroud)

要在 Axios GET 请求中设置标头,请将第二个对象传递给axios.get()调用。

const token = '..your token..' 

axios.get(url, {
  headers: {
    'Authorization': `Basic ${token}`
  }
})
Run Code Online (Sandbox Code Playgroud)


小智 7

const data = {
  email: "me@me.com",
  username: "me"
};

const options = {
  headers: {
      'Content-Type': 'application/json',
  }
};

axios.post('http://path', data, options)
 .then((res) => {
   console.log("RESPONSE ==== : ", res);
 })
 .catch((err) => {
   console.log("ERROR: ====", err);
 })
Run Code Online (Sandbox Code Playgroud)

所有高于 400 的状态码都将被 Axios catch 块捕获。

此外,标题对于 Axios 中的 post 方法是可选的


Isr*_*yev 6

您还可以使用拦截器来传递标头

它可以为你节省大量代码

axios.interceptors.request.use(config => {
  if (config.method === 'POST' || config.method === 'PATCH' || config.method === 'PUT')
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

  const accessToken = AuthService.getAccessToken();
  if (accessToken) config.headers.Authorization = 'Bearer ' + accessToken;

  return config;
});
Run Code Online (Sandbox Code Playgroud)


Cod*_*ker 5

我们可以将标头作为参数传递,

onClickHandler = () => {
  const data = new FormData();
  for (var x = 0; x < this.state.selectedFile.length; x++) {
    data.append("file", this.state.selectedFile[x]);
  }

  const options = {
    headers: {
      "Content-Type": "application/json",
    },
  };

  axios
    .post("http://localhost:8000/upload", data, options, {
      onUploadProgress: (ProgressEvent) => {
        this.setState({
          loaded: (ProgressEvent.loaded / ProgressEvent.total) * 100,
        });
      },
    })
    .then((res) => {
      // then print response status
      console.log("upload success");
    })
    .catch((err) => {
      // then print response status
      console.log("upload fail with error: ", err);
    });
};
Run Code Online (Sandbox Code Playgroud)