Express.js で HTTP POST ボディを取得する

はじめに

この短い記事では Express.js で POST ボディから情報を抽出する方法について説明します。 HTTP プロトコルでは、クライアントからサーバーに情報を渡す方法がいくつか用意されており、POST ボディは HTTP でデータを送信するための最も柔軟で最も一般的な方法です。

この記事では、Node.js とシンプルな Express.js サーバーを作成した経験があると仮定します。

Sending POST Data in HTTP

データは多くの理由で HTTP POST 呼び出しにより送信できます。最もよくあるのは HTML <form> または API 要求を介してです。

  • application/x-www-form-urlencoded のように、データはいくつかの異なる形式を取ることができます。 このエンコーディングのデータは、URL で見られるようなクエリ文字列のようにフォーマットされ、キーと値のパリは &foo=bar&abc=123&stack=abuse のようになります。 これはデフォルトのエンコーディングです。
  • multipart/form-data: このエンコーディングは、通常、ファイルを送信するために使用されます。 要するに、各 key-value は同じリクエストで送信されますが、異なる「パート」が「境界」で区切られ、より多くのメタデータを含みます。
  • text/plain: このデータは構造化されていないプレーンテキストとして送信され、通常は使用されません。

生の HTTP POST 要求で application/x-www-form-urlencoded エンコードを使用すると、次のようになります。

POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com

POST データの抽出

POST データにすぐにアクセスする前に、Express アプリケーションを適切に構成する必要があります。 すべての Web アプリ サーバーでボディ解析が必要なわけではなく、どのようなボディ解析が有効かはアプリケーションによって異なるため、この設定を行う必要があります。

これを設定するために、多くの形式のデータを処理できる body-parser パッケージを使用することになります。

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.post('/post-test', (req, res) => { console.log('Got body:', req.body); res.sendStatus(200);});app.listen(8080, () => console.log(`Started server at http://localhost:8080!`));

ルートを定義する前に app.use(...)body-parser がルートの前に実行され、ルートが解析された HTTP POST ボディにアクセスできることが保証されます。

これをテストするために、まず Express アプリを起動し、別のコンソール ウィンドウで curl ユーティリティを使用します。

$ curl -d "username=scott&password=secret&website=stackabuse.com" -X POST http://localhost:8080/post-testOK
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

ここで、クエリ文字列データは JavaScript オブジェクトに解析されたことがわかり、簡単にアクセスできることが確認されます。

Another important thing to note is our use of the extended option when calling bodyParser.urlencoded. Using the extended option tells body-parser to use the qs library to parse the URL-encoded data. This allows for things like objects and arrays to be encoded into the URL-encoded format.

And while urlencoded is one of the most commonly used parsers that body-parser provides, you can also use the following:

  • .json(): Parses JSON-formatted text for bodies with a Content-Type of application/json.
  • .raw(): Parses HTTP body in to a Buffer for specified custom Content-Types, although the default accepted Content-Type is application/octet-stream.
  • .text(): HTTP のボディを Content-Type で解析し、プレーンな文字列として返します。

これらのパーサーはそれぞれ、gzip または deflate でエンコードしたデータの自動インフレーションもサポートしているので、アプリケーション コードで余計な作業をしなくても透過的に圧縮が使用できるようになっています。

ミドルウェア モデルとこのパッケージがデータを解析する方法について素晴らしいことは、1 つのパーサーだけを使用することに縛られないということです。

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());app.use(bodyParser.raw());// ...

では、本文が JSON の HTTP POST 要求を送信すると、req.body プロパティの通常の JSON オブジェクトに解析されるようになりました。

POST /post-test HTTP/1.1Host: localhost:8080Content-Type: application/jsonContent-Length: 69'{"username":"scott","password":"secret","website":"stackabuse.com"}'
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

まとめ

多様で大量のデータを HTTP で送信する最も一般的な方法は、POST メソッドを使用することです。 Express のサーバー側でこのデータに簡単にアクセスする前に、body-parser パッケージなどのミドルウェアを使用して、データを簡単にアクセスできる形式にパースする必要があります。 生の HTTP リクエストからのデータが解析されると、bodyreq プロパティを介してアクセスすることができるようになります。

コメントを残す

メールアドレスが公開されることはありません。