在Node.js

时间:2017-01-20 12:52:35

标签: javascript node.js post uber-api axios

我在Postman上测试Uber API,并且我能够成功发送包含表单数据的请求。当我尝试使用Node.js和axios库转换此请求时,我收到错误。

这是我的邮递员请求的样子:

Postman POST request

我得到的回复是:{ "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获得相同的响应,我的Node.js脚本中的配置变量有问题吗?

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:11)

您也许可以使用Content-Type: 'application/x-www-form-urlencoded'。我遇到了https://login.microsoftonline.com的类似问题,它无法处理传入的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)
})

答案 1 :(得分:4)

截至2017年6月10日,axios库不支持在Node.js中发布表单数据。以下是GitHub上的问题 - https://github.com/mzabriskie/axios/issues/789

我们遇到了类似的问题,并决定切换到request库。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这不是真的!您可以使用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依赖项。您 CAN 直接从node.js发布数据。