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

szqfcxe2  于 2022-09-28  发布在  Node.js
关注(0)|答案(7)|浏览(186)

我正在Postman上测试Uber API,我能够成功发送带有表单数据的请求。当我尝试使用Node转换此请求时。js和axios库出错。
我的 Postman 请求如下:

我得到的响应是:{ "error": "invalid_client" }
下面是我在Node中所做的事情。js和axios:

var axios = require("axios");

const config = { headers: { 'Content-Type': 'multipart/form-data' } };

axios.post('https://login.uber.com/oauth/v2/token', {
  client_id: '***',
  client_secret: '***',
  grant_type: 'authorization_code',
  redirect_uri: 'http://localhost:8080/',
  code: '***'
}, config)
  .then(function(response) {
    console.log(response.data)
  })
  .catch(function(error) {
    console.log(error)
  })

当我这样做时,我得到了400个响应。
我添加了'multipart/form-data'头,因为我在Postman请求中填写了表单数据。如果没有标题,我会得到相同的结果。
我希望从Postman得到相同的响应,节点中的配置变量是否有问题。js脚本?
任何帮助都将不胜感激!

wribegjk

wribegjk1#

您可能能够使用Content-Type: 'application/x-www-form-urlencoded'。我在e1d1e上遇到了类似的问题,它无法处理传入的application/json

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: `client_id=${encodeURIComponent('**')}&client_secret=${encodeURIComponent('**')}&grant_type=authorization_code&redirect_uri=${encodeURIComponent('http://localhost:8080/')}&code=${encodeURIComponent('**')}`
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})

您还可以使用一个函数来处理对formUrlEncoded的转换,如下所示

const formUrlEncoded = x =>
   Object.keys(x).reduce((p, c) => p + `&${c}=${encodeURIComponent(x[c])}`, '')

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: formUrlEncoded({
     client_id: '***',
     client_secret: '***',
     grant_type: 'authorization_code',
     redirect_uri: 'http://localhost:8080/',
     code: '***' 
  })
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})
lbsnaicq

lbsnaicq2#

要使用内容类型application/x-www-form-urlencoded发送数据,请将e1d1e Package 为new URLSearchParams()。类似于此片段:

const axios = require("axios");
axios
  .post("https://api.zipwhip.com/user/login", new URLSearchParams({
  username: "hello",
  password: "byby",
}))
  .then((res) => console.log(res.data));
0sgqnhkj

0sgqnhkj3#

截至2017年6月10日,axios库不支持在Node.js中发布表单数据。这是GitHub上的问题-https://github.com/mzabriskie/axios/issues/789
我们遇到了类似的问题,决定切换到e1d1e库。

6jjcrrmo

6jjcrrmo4#

通过使用form-data library中的e1d1e,可以使用节点中的Axios发送multipart/form-data数据。您仍然需要将Content-Type标头设置为multipart/form-data,这可以通过FormData.getHeaders()实现:

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
form.append('my_field', 'my value');
form.append('my_other_field', 'my second value');

axios.post('http://example.com', form, { headers: form.getHeaders() })

Node 17.6.0(或更新版本)内置FormData对象,但Axios doesn't support it yet仍然需要使用form-data库。此外,内置FormData对象没有.getHeaders()方法。

wz8daaqr

wz8daaqr5#

这个用例现在在axios文档中用多个解决方案清楚地记录了下来:https://axios-http.com/docs/urlencoded#form-数据

cwtwac6a

cwtwac6a6#

从错误来看,您的client_id或client_secret似乎不正确。启用调试并共享原始请求/响应(在筛选出凭据后)。

mv1qrgav

mv1qrgav7#

这不是真的!您可以使用nodejs使用axios发布数据。我已经做到了。问题是,如果在服务器端使用PHP,则需要注意一个陷阱。Axios以JSON格式(Content-Type:application/JSON)发布数据,使用此内容类型时,不会填充PHP的标准$_POST数组。所以它总是空的。为了获得通过json请求发送的post参数,需要使用file_get_contents(“http://php://input”)。
服务器端的一个简单PHP脚本是:

if($_SERVER['REQUEST_METHOD']==='POST' && empty($_POST)) {
 $_POST = json_decode(file_get_contents('http://php://input'));
}

使用此方法可以避免formData依赖项。您可以直接从node.js发布数据。

相关问题