1

requestnpm パッケージを使用して、リクエスト本文の文字列表現の base64 エンコード MD5 ハッシュで構成される特別なヘッダーを必要とする API に、HTTP POST を送信しようとしています。

MD5 ハッシュを生成するコード:

function md5(val) {
    val = val || '';
    return crypto.createHash('md5').update(val).digest('base64');
}

formData がない場合、GET または DELETE リクエストの場合、使用することになっている値は空の文字列であり、うまく機能します。API はヘッダーを受け取り、要求されたデータを返します。

残念ながら、formDataオプションを使用してファイルを投稿すると、オブジェクトはrequestモジュールによってエンコードされます。そのため、サーバーが私の MD5 ハッシュをサーバー側で受信した本文と比較すると、一致せず、エラーがスローされます。

必要なものの単純化された要求:

var formData = {
    left: 0,
    top: 0,
    width: 0,
    height: 0,
    profileImage: fs.readFileSync(__dirname + '/test_image.jpg')
};

var reqOptions = {
    url: 'https://example.com/user/1234/profile-image',
    method: 'POST,
    json: true,
    headers: {
        'Content-MD5': md5(formData)
    },
    formData: formData
}

request(reqOptions, function(err, response, body) {
    //process the response...
});

上記の例では、formData 変数がオブジェクトであり、cryptoモジュールが文字列を想定しているため、エラーがスローされます。formData オブジェクトを文字列に変換するコードを手動で書き始めましたが、requestモジュールによって既に行われているときに、すべてのフォーム値をエンコードするすべてのロジックを書き直すのは少しばかげているようです。

モジュールによって処理された後、リクエストが実際に送信される前に、正確にエンコードされたフォームのコンテンツを取得する信頼できる方法を探しているので、ハッシュ値を作成してヘッダーを追加できます。request

4

2 に答える 2