如果我做了
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);
}
}
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中的URLSearchParams
API或使用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