axios 为带有表单数据的发布请求返回 404

Posted

技术标签:

【中文标题】axios 为带有表单数据的发布请求返回 404【英文标题】:axios returns 404 for a post request with form data 【发布时间】:2021-08-02 18:16:18 【问题描述】:

我正在尝试从 Azure AD 获取图形令牌,其中包含通过 Axios 的表单数据的发布请求。响应会引发错误Request failed with status code 404。下面是代码,

const axios = require('axios')
const FormData = require('form-data')
    
const bodyFormData = new FormData()
    
bodyFormData.append('client_id', <client id>)
bodyFormData.append('client_secret', <secret>)
bodyFormData.append('scope', <scope>)
bodyFormData.append('requested_token_use', <token use>)
bodyFormData.append('assertion', <token>)
    
axios
.post('https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/token', bodyFormData, 
headers: bodyFormData.getHeaders(),
)
.then((response) => 
console.log('AXIOS RESPONSE ', response)
)
.catch((err) => 
console.log('AXIOS ERROR ', err)
)

post 请求在邮递员中工作正常。如果 bodyFormData 从 Axios 请求中删除,Axios 中的响应也符合预期。当 bodyFormData 添加到请求中时,我遇到了错误。

AXIOS ERROR 错误:请求失败,状态码为 404

【问题讨论】:

检查bodyFormData.getHeaders() 【参考方案1】:

不要使用form-data,而是使用querystring

const axios = require('axios')
const querystring = require('querystring');

const data = querystring.stringify(
    client_id: '<client id>',
    client_secret: '<secret>',
    scope: '<scope>',
    requested_token_use: '<token use>',
    assertion: '<token>'
);

axios.post('https://login.microsoftonline.com/<tenantId>/oauth2/v2.0/token', data)
    .then((response) => 
        console.log('AXIOS RESPONSE ', response)
    )
    .catch((err) => 
        console.log('AXIOS ERROR ', err)
    );

【讨论】:

为我工作!谢谢一百万 为什么要修复它(因为它对我们有用)?!【参考方案2】:

尝试删除标题部分,它应该可以工作。

没有任何理由必须从 FormData 对象中获取标头,因为它是一个 API,并且会使用其他形式的身份验证,并且可能会弄乱调用。

这不是可能被某些安全措施阻止的数据抓取调用。

【讨论】:

请补充一些细节。导致问题的原因和解决方案背后的逻辑是什么 我删除了标题。不过,我遇到了错误。另外,我在我的节点包中添​​加了 cors。但仍然面临 404。 CORS 应该不是问题,因为您正在调用外部 api。

以上是关于axios 为带有表单数据的发布请求返回 404的主要内容,如果未能解决你的问题,请参考以下文章

使用 Guzzle 发布表单数据总是返回 404

spring 控制器返回 404 并带有 post 和 file 以生成响应实体

在 Node.js 中使用 axios 发布表单数据

使用带有参数对象的 Axios Post 没有返回数据

React - 带有文件和字符串的 Axios POST 表单数据

使用表单数据和 axios 发送文件