HTTP

今回はhttpモジュールを用いてHTTPサーバー、HTTPクライアントを作成します。

HTTPサーバー

まずは簡単なWebサーバーを書いてみましょう。

const http = require("http");

http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/plain"});
  res.end("Hello HTTP");
}).listen(1337, '127.0.0.1');

これだけで簡易的なWebサーバーが書けました。

まずはターミナルを開いて実行します。

そしてブラウザで127.0.0.1:1337にアクセスし、Hello HTTPと出力されたら成功です。

コードの解説をします。

まず、creteServer()でhttp.Serverのオブジェクトを生成して、localhostの1337ポートで待ち受けます。

http.createServer().listen(1337, '127.0.0.1');

createServer()の引数にイベントハンドラーを渡します。

http.createServer(function(req, res) {})

次にレスポンスのヘッダを指定します。

  res.writeHead(200, {"Content-Type": "text/plain"});

最後にメッセージボディに指定の文字列を出力します。

res.end("Hello World");

POST GET PUT DELETE

RESTfulサーバーを作るのに必要不可欠なメソッドをNode.jsの標準機能で実装していきます。

実際にアプリケーションを作成する際にはexpressなどのテンプレートエンジンを使用するため、このような処理を自前で書くことはあまりないです。

しかし、内部でどのような処理が行われているか知ることで理解が深まるので実装してみましょう。

const http = require('http');

var server = http.createServer();
var port = 1337;
var dataObj = {};

server.on('request', function (req, res) {
  var header = {'Connection':'close', 'Content-Length':0};
  var key = req.url;
  switch (req.method) {
    case 'POST':
      console.log('POSTだよ!');
      if(dataObj[key]){
        res.writeHead(403, header);
      }else{
        var data = '';
        req.on('data', function (chunk) {
          data += chunk;
        })
        req.on('end', function () {
          dataObj[key] = JSON.parse(data);
          res.writeHead(200, header);
        })
      }
      res.end();
      break;
    case 'GET':
      console.log('GETだよ!');
      if(dataObj[key]){
        var json = JSON.stringify(dataObj[key]);
        res.writeHead(200, {
          'Content-Length':Buffer.byteLength(json),
          'Content-Type':'application/json',
          'Connection':'close'
        });
        res.write(json);
      }else{
        res.writeHead(404, header);
      }
      res.end();
      break;
    case 'PUT':
      console.log('PUTだよ!');
      if(dataObj[key]){
        var data = '';
        req.on('data', function (chunk) {
          data += chunk;
        })
        req.on('end', function () {
          dataObj[key] = JSON.parse(data);
          res.writeHead(200, header);
        })
      }else{
        res.writeHead(403, header);
      }
      res.end();
      break;
    case 'DELETE':
      console.log('DELETEだよ');
      if(dataObj[key]){
        delete dataObj[key];
        res.writeHead(200, header);
      }else{
        res.writeHead(404, header);
      }
      res.end();
      break;
    default:

  }
})

server.listen(port, function () {
  console.log('listening on ' + port);
});

今回の実装は

  • POSTでjsonを一度だけ投げ、サーバーに保持できる。
  • GETでサーバーに保持されたjsonを取り出せる。
  • PUTでサーバーに保持されたjsonを変更できる。
  • DELETEでサーバーに保持されたjsonを削除できる。

という仕様になっています

ターミナルを開き、スクリプトを実行します。

また、別ウィンドウでもう一つターミナルを開きcurlコマンドで先ほど作成したメソッドを叩きます。

POST

$ curl -X POST -D - -d '{"a":1}' http://127.0.0.1:1337/a
HTTP/1.1 200 OK
Date: Fri, 19 Aug 2016 04:28:20 GMT
Connection: keep-alive
Content-Length: 0

初めて叩くときはPOSTで{"a":1}のjson文字列をPOSTします。

もう一度実行すると、以下のようにPOSTが失敗します。

$ curl -X POST -D - -d '{"a":1}' http://127.0.0.1:1337/a
HTTP/1.1 403 Forbidden
Connection: close
Content-Length: 0
Date: Fri, 19 Aug 2016 04:29:17 GMT

GET

POSTしたjsonを取り出します。

$ curl -X GET -D - http://127.0.0.1:1337/a
HTTP/1.1 200 OK
Content-Length: 7
Content-Type: application/json
Connection: close
Date: Fri, 19 Aug 2016 04:30:22 GMT

{"a":1}

このように出力されると成功です。

もしPOSTを一度もせずに実行すると以下のようになり、失敗します。

$ curl -X GET -D - http://127.0.0.1:1337/a
HTTP/1.1 404 Not Found
Connection: close
Content-Length: 0
Date: Fri, 19 Aug 2016 04:31:09 GMT

PUT

POSTしたjsonを修正します。

$ curl -X PUT -D - -d '{"a":2}' http://127.0.0.1:1337/a
HTTP/1.1 200 OK
Date: Fri, 19 Aug 2016 04:37:18 GMT
Connection: keep-alive
Content-Length: 0

このように出力されると成功です。

もしPOSTを一度もせずに実行すると以下のようになり、失敗します。

$ curl -X PUT -D - -d '{"a":2}' http://127.0.0.1:1337/a
HTTP/1.1 403 Forbidden
Connection: close
Content-Length: 0
Date: Fri, 19 Aug 2016 04:37:09 GMT

DELETE

サーバーに保持されているjsonを削除します。

$ curl -X DELETE -D - http://127.0.0.1:1337/a
HTTP/1.1 200 OK
Connection: close
Content-Length: 0
Date: Fri, 19 Aug 2016 04:41:55 GMT

このように出力されれば成功です。

サーバーにjsonが存在しない場合は以下のように出力されます。

$ curl -X DELETE -D - http://127.0.0.1:1337/a
HTTP/1.1 404 Not Found
Connection: close
Content-Length: 0
Date: Fri, 19 Aug 2016 04:42:44 GMT

results matching ""

    No results matching ""