首页 > 解决方案 > 为什么 CURL 工作时 Axios 出现错误 415?

问题描述

如果我做

curl -s -d "username=test&password=test" -X POST https://example.com/api/jwt/login

然后我得到了预期的令牌。如果我做

const axios = require('axios')

async function getToken() {
  try {
    const response = await axios.post('https://example.com/api/jwt/login', {
      headers: {'Content-Type': 'application/x-www-form-urlencoded'},
      params: {
        username: "test",
        password: "test"
      }
    })
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}
getToken()

然后我得到

Error 415 Unsupported Media Type
HTTP ERROR 415
Problem accessing /api/jwt/login. Reason:
Unsupported Media Type

问题

谁能弄清楚为什么它适用于curl而不适用于axios?我究竟做错了什么?

更新

以下给出了相同的错误

const qs = require('query-string');

async function getToken() {
  try {
    const response = await axios.post('https://example.com/api/jwt/login', {
      method: 'post',
      params: qs.stringify({
        username: "test",
        password: "test"
      })
  })
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

标签: javascriptnode.jscurlecmascript-6axios

解决方案


的论据axios.posturl[, data[, config]]。请参阅文档。您的示例将以下内容传递给data参数,该参数将是请求正文:

{
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  params: {
    username: "test",
    password: "test"
  }
}

服务器无法解析或解析不正确,因此返回415 Unsupported Media Type

您需要做的是分离出您的请求正文和配置。您的请求正文也需要进行编码

axios.post(
  'https://example.com/api/jwt/login',
  qs.stringify(({
    username: "test",
    password: "test"
  }),
  {
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
  }
)

推荐阅读