Node.js: request モジュールを使って POST リクエストを行う

GET リクエストに続き、POST リクエストも request モジュールを使って行う。フォーマットを「application/x-www-form-urlencoded」形式で送信する場合、form プロパティで指定する。レスポンスが JSON の場合、json プロパティに true を指定すれば、body に JSON.parse を適用する必要がなくなる。

var request = require('request');

var options = {
  uri: 'http://localhost:9000/',
  form: { name: 'テストユーザー' },
  json: true
};

request.post(options, function(error, response, body){
  if (!error && response.statusCode == 200) {
    console.log(body.name);
  } else {
    console.log('error: '+ response.statusCode);
  }
});

サーバーのコードは次のとおり。

var express = require('express');
var app = express();
app.use(express.bodyParser());

app.post('/', function(req, res){

  var data = {};
  data.name = req.body.name;
  res.set('Content-Type', 'application/json');
  res.json(data);
});

app.listen(9000);

比較のために http モジュールのコードを示す。

var http = require('http');
var querystring = require('querystring');

var options = {
  hostname: 'localhost',
  port: 9000,
  path: '',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
};

var data = querystring.stringify({
    'name': 'テストユーザー'
});

var req = http.request(options, function(res) {

  var body = '';
  res.setEncoding('utf8');

  res.on('data', function(chunk) {
    body += chunk;
  });

  res.on('end', function() {
    var name = JSON.parse(body).name;
    console.log(name);
  });

}).on('error', function(e) {
  console.log(e.message);
});

req.write(data);
req.end();

クライアントが JSON を送信するようにコードを修正する場合、サーバーサイドのコードは修正しなくてもよい。これは connect の bodyParser のおかげである。

var request = require('request');

var options = {
  url: 'http://localhost:9000/',
  headers: {  'Content-Type': 'application/json' },
  json: true,
  body: JSON.stringify({ name: 'テストユーザー' })
};

request.post(options, function(error, response, body){
  if (!error && response.statusCode == 200) {
    console.log(body.name);
  } else {
    console.log('error: '+ response.statusCode);
  }
});