多くのシナリオでは、サーバーはフォームの送信など、ユーザーのブラウザを処理する必要があります。

フォームは通常、GET/POST リクエストを使用してサーバーに送信されます。

この章では、Node.js の GET/POST リクエストを紹介します。

<時間>

GET リクエストのコンテンツを取得する

GET リクエストはパスに直接埋め込まれているため、URL は ? 以降の部分を含む完全なリクエスト パスとなり、後者のコンテンツを GET リクエストのパラメータとして手動で解析できます。

node.js の url モジュールの parse 関数がこの機能を提供します。

var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
    res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);

ブラウザで http://localhost:3000/user?name=html&url=w3cstudy.cc にアクセスし、返された結果を確認します。

URL パラメータを取得する

url.parse メソッドを使用して URL 内のパラメータを解析できます。コードは次のとおりです。

var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
 
    // URLパラメータを解析します
    var params = url.parse(req.url, true).query;
    res.write("ウェブサイト名:" + params.name);
    res.write("\n");
    res.write("Webサイト URL:" + params.url);
    res.end();
 
}).listen(3000);

ブラウザで http://localhost:3000/user?name=html&url=w3cstudy.cc にアクセスし、返された結果を確認します。

POST リクエストのコンテンツを取得する

POST リクエストの内容はすべてリクエストボディに含まれており、リクエストボディの送信を待つのは時間がかかる可能性があるため、http.ServerRequest にはリクエストボディとして属性 content がありません。

たとえば、ファイルのアップロードなど、多くの場合、リクエスト本文の内容に注意を払う必要はありません。悪意のある POST リクエストはサーバー リソースを大幅に消費するため、node.js はデフォルトでリクエスト本文を解析しません。 、手動で行う必要があります。

基本的な文法構造の説明

var http = require('http');
var querystring = require('querystring');
var util = require('util');
 
http.createServer(function(req, res){
   // リクエストボディの情報を一時的に保存するために post 変数が定義されます
    var post = '';     
 
   // reqのデータイベント監視機能により、リクエストボディのデータを受信するたびにpost変数に追加されます
    req.on('data', function(chunk){    
        post += chunk;
    });
 
   // 終了イベントがトリガーされた後、投稿は querystring.parse を通じて実際の POST リクエスト形式に解析され、クライアントに返されます。
    req.on('end', function(){    
        post = querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(3000);	

次のフォーム例は、POST 経由でデータを送信および出力します。

var http = require('http');
var querystring = require('querystring');
 
var postHTML = 
  '<html><head><meta charset="utf-8"><title> Node.js インスタンス</title></head>' +
  '<body>' +
  '<form method="post">' +
  'ウェブサイト名: <input name="name"><br>' +
  'Webサイト URL: <input name="url"><br>' +
  '<input type="submit">' +
  '</form>' +
  '</body></html>';

http.createServer(function (req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    // パラメータを解析する
    body = querystring.parse(body);
   // レスポンスヘッダ情報とエンコードを設定する
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
 
    if(body.name && body.url) { // 提出されたデータを出力する
        res.write("ウェブサイト名:" + body.name);
        res.write("<br>");
        res.write("Webサイト URL:" + body.url);
    } else {  //出力フォーム
        res.write(postHTML);
    }
    res.end();
  });
}).listen(3000);