提问者:小点点

为什么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);
  }
}

共3个答案

匿名用户

axios.post的参数是url[,data[,config]]。 参见文档。 您的示例将以下内容传递给data参数,该参数将成为请求主体:

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

服务器无法解析或解析不正确,因此返回415不支持的媒体类型

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

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

匿名用户

由于content-type作为application/x-www-form-urlencoded不能传入javascript对象,因此需要对其进行解析。

您可以使用JavaScript中的URLSearchParamsAPI或使用QS包来完成此操作。 您还需要在负载中使用data键而不是params键:

const axios = require('axios')
const qs = require('qs')

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

您可以在axios github上找到概述这一点的文档:https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format

匿名用户

尝试使用querystring模块对数据进行编码

npm install query-string

后来呢

const qs = require('query-string');
//...    
data: qs.stringify({
username: "test",
password: "test"
}),

https://www.npmjs.com/package/query-string