2017-09-20 7 views
0

アプリケーション/ JSONなどのContent-Typeを設定しません今、私が郵便配達員を使って同じ要求をしたとき、私は正しい結果を得ていますので、何かが自分のコードで間違っていると推測しました。私はそれを理解できないようです。リクエストとペイロードを作成するコードは次のとおりです。ノード要求モジュールは、私が作っていたHTTPリクエストは、このエラーメッセージを返している私のNodeJS/Koa.jsアプリで奇妙な問題を抱えてい

// Content Type 
     if(options.contentType === 'json') { 
      headers['Content-Type'] = 'application/json'; 
     } 

     // Content Length 
     if(options.contentLength) { 
      reqHeaders['Content-Length'] = options.contentLength 
     } 

     if(headers) { 
      for(let key in headers) { 
       if(!headers.hasOwnProperty(key)) { 
        continue; 
       } 

       reqHeaders[key] = headers[key]; 
      } 
     } 

     const payload = { 
      headers : reqHeaders, 
      url  : url, 
      method : requestType, 
      timeout : 10000, 
      form : vars, 
      followRedirect: true, 
      maxRedirects: 10, 
      body : '' || options.body 
     }; 

     return new Promise(function(resolve, reject) { 
      request(payload, function(error, response, body) { 
       if(response) { 
        if(!error && response.statusCode === 200) { 
         resolve(response, body); 
        } else { 
         if(response.statusCode === 401) { 
          console.log('token expired'); 
         } 
         reject(response, body); 
        } 
       } 
      }); 
     }); 

ペイロード:あなたが見ることができるように、私は私のヘッダーに正しいのContent-Typeヘッダを持っている

{ 
    "headers": { 
    "Cookie": "XDEBUG_SESSION=PHPSTORM", 
    "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWdvdWxkLWxvZ2luLmRldiIsImFjY291bnQiOiI1OTY3NmFmZmYyOWE1NWI2MTViOWFiMWEiLCJhdXRoTGV2ZWwiOjAsImlhdCI6MTUwNTg5OTQ3MX0.r-XaeTsQTjSkab9SNjrHgnh6lrgNP0uJCaDIV22A6gM", 
    "Content-Type": "application/json" 
    }, 
    "url": "http://54.***.***/api/Report/History", 
    "method": "POST", 
    "timeout": 10000, 
    "form": { 
    "AccountId": "59676afff29a55b615b9ab1a", 
    "StartDate": "2017-09-19T10:11:47.0266607+00:00", 
    "EndDate": "2017-09-19T10:11:47.0266607+00:00", 
    "VIN": "SALLAK" 
    }, 
    "followRedirect": true, 
    "maxRedirects": 10 
} 

はそれは私が要求機能に渡すペイロードにされているオブジェクトが、それはまだかのようにseeems x-www-form-encodedとして送信しています。誰がここで間違っているかもしれないかを誰が見ることができる?

おかげ

答えて

2

docs読み出し:

  • 形 - オブジェクトまたはクエリ文字列を通過するとき、この値のクエリ文字列表現に本体を設定し、コンテンツタイプを追加: アプリケーション/ x-www-form-urlencodedヘッダー。アプリケーション/ JSONヘッダー: -

  • JSON値の集合体JSONの表現とは、コンテンツタイプを追加します。

あなたはformを使用しているので、ヘッダーを上書きします。代わりにjsonを使用してください。とにかくヘッダーを上書きしますが、値は 'application/json'になります。これは問題ありません。

+0

パーフェクト!おかげで – devoncrazylegs

1

提案のカップル私は可能性がある場合:

  • あなたがオブジェクトのヘッダーを設定するObject.assignを使用することができます。
  • json: trueを設定すると、適切なコンテンツタイプのヘッダーを配置します。
  • 手動でコンテンツの長さを設定する必要はありません。これはやりにくいことです。それを要求してください。
  • 約束を返す場合は、fullResponseでrequest-promiseを有効にしてトークンの有効期限を確認することを検討してください。

    if(headers) { 
        Object.assign(reqHeaders, headers); 
    } 
    
    const payload = { 
        headers: reqHeaders, 
        url: url, 
        method: requestType, 
        timeout: 10000, 
        json: true, 
        followRedirect: true, 
        maxRedirects: 10, 
        body: options.body || {}, 
        fullResponse: true 
    }; 
    
    return rp(payload).then(function(response) { 
        if (response.statusCode === 401) { 
        throw Error('Token expired'); 
        } 
        return response.body; 
    }); 
    
+0

ありがとう!元のクラスはしばらく前に書かれていたので、これらのすべてが再フォーマットで実装されるはずでした。しかし、提案をありがとう。非常に役立ちます – devoncrazylegs

関連する問題