web-dev-qa-db-ja.com

node.jsを使用してリクエストに投稿する方法

JsonをURLに投稿しようとしています。 stackoverflowでこれに関する他のさまざまな質問を見ましたが、それらのいずれも明確または機能していないようでした。これは私がどこまで到達したか、私はAPIドキュメントの例を修正しました:

var http = require('http');
var google = http.createClient(80, 'server');
var request = google.request('POST', '/get_stuff',
  {'Host': 'sever',  'content-type': 'application/json'});
request.write(JSON.stringify(some_json),encoding='utf8'); //possibly need to escape as well? 
request.end();
request.on('response', function (response) {
  console.log('STATUS: ' + response.statusCode);
  console.log('HEADERS: ' + JSON.stringify(response.headers));
  response.setEncoding('utf8');
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

これをサーバーに投稿すると、json形式ではないか、utf8ではないというエラーが表示されます。リクエストURLをプルしようとしましたが、ヌルです。私はnodejsから始めているので、素敵になってください。

31
Mr JSON

問題は、Content-Typeを間違った場所に設定していることです。これは、リクエストヘッダーの一部であり、オプションオブジェクトに独自のキー、request()メソッドの最初のパラメーターがあります。ワンタイムトランザクションにClientRequest()を使用する実装を次に示します(同じサーバーに複数の接続を作成する必要がある場合は、createClient()を保持できます)。

var http = require('http')

var body = JSON.stringify({
    foo: "bar"
})

var request = new http.ClientRequest({
    hostname: "SERVER_NAME",
    port: 80,
    path: "/get_stuff",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Content-Length": Buffer.byteLength(body)
    }
})

request.end(body)

質問の残りのコードは正しいです(request.on()以下)。

40
Ankit Aggarwal

ジャムスはこれを正しかった。 Content-Lengthヘッダーが設定されていない場合、本文の先頭にはある種の長さが含まれ、末尾には0が含まれます。

だから私がノードから送信していたとき:

{"email":"[email protected]","passwd":"123456"}

my Railsサーバーは受信していました:

"2b {"email":"[email protected]","passwd":"123456"} 0  "

Railsは2bを理解していなかったため、結果を解釈しませんでした。

そのため、JSONを介してパラメーターを渡すには、Content-Typeをapplication/jsonに設定し、常にContent-Lengthを指定します。

14

JSONをPOSTとしてNodeJSを使用して外部APIに送信するには...(および「http」モジュール)

var http = require('http');

var post_req  = null,
    post_data = '{"login":"toto","password":"okay","duration":"9999"}';

var post_options = {
    hostname: '192.168.1.1',
    port    : '8080',
    path    : '/web/authenticate',
    method  : 'POST',
    headers : {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache',
        'Content-Length': post_data.length
    }
};

post_req = http.request(post_options, function (res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('Response: ', chunk);
    });
});

post_req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

post_req.write(post_data);
post_req.end();
9
molokoloco

NodejsでPOSTリクエストを送信することをサポートする非常に優れたライブラリがあります。

リンク: https://github.com/mikeal/request

サンプルコード:

var request = require('request');

//test data
var USER_DATA = {
    "email": "[email protected]",
    "password": "a075d17f3d453073853f813838c15b8023b8c487038436354fe599c3942e1f95"
}

var options = {
    method: 'POST',
    url: 'URL:PORT/PATH',
    headers: {
        'Content-Type': 'application/json'
    },
    json: USER_DATA

};


function callback(error, response, body) {
    if (!error) {
        var info = JSON.parse(JSON.stringify(body));
        console.log(info);
    }
    else {
        console.log('Error happened: '+ error);
    }
}

//send request
request(options, callback);
6
Dio Phung

コンテンツの長さを含めてみてください。

var body = JSON.stringify(some_json);
var request = google.request('POST', '/get_stuff', { 
    Host: 'server',
    'Content-Length': Buffer.byteLength(body),
    'Content-Type': 'application/json' 
    });
request.write(body);
request.end();
4
jammus

これはあなたの問題を解決しないかもしれませんが、javascriptは名前付き引数をサポートしていません。

request.write(JSON.stringify(some_json),encoding='utf8');

あなたは言っているべきです:

request.write(JSON.stringify(some_json),'utf8');

Encoding =はグローバル変数に割り当てられているため、有効な構文ですが、おそらく意図したとおりには動作しません。

3
RandomEtc

この質問が行われた時点ではおそらく存在していなかったため、最近では https://github.com/mikeal/request などのhttp要求を処理するために、より高いレベルのライブラリを使用できます。 Nodeの組み込みhttpモジュールは、初心者にとっては低レベルです。

Mikealのリクエストモジュールには、JSONを直接処理するための組み込みのサポートがあります(特に https://github.com/mikeal/request#requestoptions-callback のドキュメントを参照)。

3
jbmusso
var request = google.request(
  'POST',
  '/get_stuff',
  {
    'Host': 'sever',
    **'headers'**:
    {
      'content-type': 'application/json'
    }
  }
);
1
Jasper Fu