Axios包的POST请求无法将以JSON或表单数据形式发送的数据发布到REST端点

xmd2e60i  于 2023-03-29  发布在  iOS
关注(0)|答案(2)|浏览(185)

我正在使用Node 16.15.x应用程序中最新的'axios'替换npm的弃用'request'包。
但是,我遇到了一个问题,一个POST请求通过axios发送(其他POST请求我能够实现)
下面是使用'request'包POST的代码

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)
})

这给出了预期的响应。这是一个令牌。我使用的是一个示例REST服务器“https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken
现在,当使用'axios' POST尝试相同的POST请求时,

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)
    })

响应为200,但响应数据显示错误为“Invalid request Usage:https://sampleserver6.arcgisonline.com/arcgis/tokens?request=gettoken&username=username&password=password&"
当您在表单中未输入值/部分值并单击“生成令牌”时,sample REST server也会出现相同的错误。因此,似乎“axios”无法按预期输入表单数据。
我是否在'axios' POST中使用了正确的实现?
我也试过使用'form-data'包-〉同样的错误
我尝试了不同的Content-Type -〉Issue persists

5q4ezhmt

5q4ezhmt1#

使用URLSearchParams而不是FormData对我来说很有效。

const param = new URLSearchParams({
  'username': 'user1',
  'password': 'user1',
  'client': 'requestip',
  'expiration': 60,
  'f': 'json',
});

axios({
  method: 'post',
  url: 'https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken',
  data: param.toString()
});

P.S:没有传递任何标题。

dw1jzc5e

dw1jzc5e2#

您的Content-Type值错误。您正在发送一个JS对象,因此内容类型应为application/json;然而,我建议你让库来决定这个值。你可以用你的navigator开发工具来检查请求,以验证内容类型的值。然而,这应该是可行的:

axios
  .post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', {
        username: 'user1',
        password: 'user1',
        client: 'requestip',
        expiration: 60,
        f: 'json',
    })
    .then(({data}) {
        console.log('****Token', data)
    })

const form = new FormData() //generally used to upload files
form.append('username', 'user1');
form.append('password', 'user1');
form.append('client', 'requestip');
form.append('expiration', 60);
form.append('f', 'json');

axios
  .post('https://sampleserver6.arcgisonline.com/arcgis/tokens/generateToken', form)
    .then(({data}) {
        console.log('****Token', data)
    })

相关问题