You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node 16.x中Axios替代request发送POST表单数据至REST端点失败

Axios替代request后POST请求表单数据未正确提交问题解决

问题场景

在Node 16.15.x应用中用最新版Axios替代已废弃的request包时,某POST请求无法正确提交表单数据。原request代码可成功获取令牌,但Axios实现返回200状态码却提示参数不全的错误。

原request工作代码

request.post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', {
    form: {
        'username': 'user1',
        'password': 'user1',
        'client': 'requestip',
        'expiration': 60,
        'f': 'json',
    }
}, (err, response, body) => {
    console.log('****Token', body)
})

Axios问题代码

axios.post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', {
        'username': 'user1',
        'password': 'user1',
        'client': 'requestip',
        'expiration': 60,
        'f': 'json',
    }, {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        }
    })
    .then(function(response) {
        console.log('****Token', body)
    })

报错信息

Invalid request Usage: https://sampleserver6.arcgisonline.com/arcgis/tokens?request=gettoken&username=username&password=password&

问题原因

request的form选项会自动将对象编码为application/x-www-form-urlencoded格式的表单数据,而Axios默认会把传入的JavaScript对象序列化为JSON格式。即使手动设置了Content-Type头,Axios也不会自动将对象转换为表单编码格式,导致服务器无法解析到正确的参数。

另外,原Axios代码的then回调中直接使用body是错误的,Axios的响应数据需要通过response.data获取。

解决方案

方案1:使用URLSearchParams构造表单数据

Node.js内置URLSearchParams,可直接用来构造符合要求的表单数据:

const axios = require('axios');

const params = new URLSearchParams();
params.append('username', 'user1');
params.append('password', 'user1');
params.append('client', 'requestip');
params.append('expiration', 60);
params.append('f', 'json');

axios.post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', params)
  .then(function(response) {
    console.log('****Token', response.data);
  })
  .catch(function(error) {
    console.error(error);
  });

方案2:使用qs库序列化对象

先安装qs库:

npm install qs

然后修改Axios代码:

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

axios.post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', qs.stringify({
  'username': 'user1',
  'password': 'user1',
  'client': 'requestip',
  'expiration': 60,
  'f': 'json',
}), {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  }
})
.then(function(response) {
  console.log('****Token', response.data);
})
.catch(function(error) {
  console.error(error);
});

两种方案都能将数据正确编码为表单格式,让服务器正常解析参数,从而成功获取令牌。

内容的提问来源于stack exchange,提问作者Mayur Shinde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:18:39