web-dev-qa-db-ja.com

Node.jsでaxiosを使用してフォームデータを送信する

PostmanでUber APIをテストしており、フォームデータを含むリクエストを正常に送信できます。 Node.jsとaxiosライブラリを使用してこのリクエストを翻訳しようとすると、エラーが発生します。

Postmanのリクエストは次のようになります。

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の応答が返されます。

Postmanリクエストでフォームデータに入力したため、'multipart/form-data'ヘッダーを追加しました。ヘッダーがなければ、同じ結果が得られます。

Postmanから得たのと同じ応答が得られると期待していますが、Node.jsスクリプトの構成変数に何か問題がありますか?

助けていただければ幸いです!

14
Mike

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)
})
16
Reid Evans

2017年6月10日に関しては、axiosライブラリはNode.jsでのフォームデータのポストをサポートしていません。 GitHubの問題- https://github.com/mzabriskie/axios/issues/789

同様の問題があり、requestライブラリに切り替えることにしました。

5
anuveyatsu

エラーから、client_idまたはclient_secretが間違っているようです。デバッグを有効にし、生の要求/応答を共有します(資格情報をフィルタリングした後)。

1
Dustin Whittle

それは本当ではない! nodejsを使用して、axiosでデータを投稿できます。やった問題は、サーバー側でPHPを使用する場合、注意が必要な落とし穴があります。AxiosはJSON形式(Content-Type:application/json)PHPの標準でデータをポストしますこのコンテンツタイプが使用されると、$ _ POST配列は設定されません。したがって、常に空になります。jsonリクエストを介して送信される投稿パラメーターを取得するには、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から直接データを投稿できます。

0
salihcenap