NodeSchoolに入学しよう!

JSONAPIサーバーの作成

全333コースを10日間無料で

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
httpモジュールを使用して、JSONレスポンスを返す、HTTPのAPIサーバーを作成する方法について学びます。
講師:
13:31

字幕

このレッスンでは、Node.jsで、 JSONレスポンスを返す HTTPのAPIサーバーを作成する 方法について学びます。 それでばまず、ワークショッパーを 開いてください。 learnyounode、エンター。 今回はこちらの最後の、 HTTP JSON API SERVER、 という問題を解きます。 エンターを押します。 問題。GETリクエストを受けて、 JSONをレスポンスで返す HTTPサーバーを書いてください。 このサーバーは、2つのエンドポイントを 持つものとします。 /api/parsetime それから、/api/unixtime なお、リッスンするポート番号は、 コマンドラインの第一引数で 与えられるものとします。 /api/parsetimeという エンドポイントの方は、 クエリー文字列として iso8601フォーマットで記述された、 日時を受け取ります。 このiso8601というのは、 国際標準化された 日時指定の仕方で、 Javaスクリプトのデートオブジェクトで パースすることができます。 そしてこのAPIは、受け取った 日時の指定を解析したうえで、 それらに含まれる時間と、分と、秒の部分を、 JSONとしてこちらに記述されているような、 フォーマットで返します。 またもう一つの/api/unixtime というエンドポイント、URLは、 こちらもisoというクエリー文字列を パラメーターとしてとり、 そしてレスポンスとして、 こちらはunixtime unixtimeというのは、コンピューターで 絶対時刻を表すために、 よく使われる時間の指定方法で、 1970年1月1日の0時0分0秒、 からの経過時刻を秒で示しています。 このunixtimeを使うと、 ある時点とある時点の差などが、 引き算だけで計算できるので、 簡単に計算できます。 それではこの問題を解くために いくつかヒントを出します。 ノードインタープリターを起動します。 まずこの問題では、GETでクライアントから URLを解析して、 そのURLに応じて、処理の結果を 変える必要があります。 HTTPのリクエストで、URLを判別するには、 requestオブジェクトのurl、 というプロパティを使用します。 こちらのrequestのurlという プロパティには、例えば、 こちらのように http://example.com/test http://example.com/test そしてクエリー文字列が入って、 iso=2013.08.10T12.10の:15.474Z、 iso=2013.08.10T12.10の:15.474Z、 こういったURLの文字列が入っています。 文字列でそのままURLの全ての部分が 入っているので、このままでは、 プログラムで処理するには ちょっと向いていません。 そこで、urlというモジュールを使用します。 require('url')の、 parseメソッドですね。こちらにURLの 文字列を渡してやります。 そしてこのメソッドの2番目の パ ラメーターには、 trueを指定します。 trueを指定すると、クエリー文字列の 部分まで含めてURLをパースしてくれて、 クエリー文字列の部分はオブジェクトの 形式になって取得できます。 では今定義したURLを パースしてみます。 これをそのままコントロールログで 出力してみましょう。 URLがこのような、プログラムで使いやすい、 オブジェクトの形に変換されました。 クエリー文字列の部分もちゃんと、 オブジェクト形式に変換されています。 さて次に、このURLに入っている クエリー文字列で指定された時刻を、 デートオブジェクトに 変換する必要があります。 デートオブジェクトに変換してしまえば、 その中身をunixエポックタイムで、 指定された秒数に 変換することも容易です。 デートオブジェクトに変換するためには、 デートのコンストラクターを使用します。 そこに今取得したクエリー文字列のなかの、 isoというプロパティーを そのまま渡してやれば、 このようにデートオブジェクトに変換されました。 これはtoISOstringという メソッドを使用すれば、 再度iso形式に変換することも可能ですし、 またデートオブジェクトに対して、 getTimeというメソッドを呼び出してやれば、 このようにエポックタイム形式に 変換することもできます。 さてさらに、このHTTPサーバーでは、 レスポンスをJSON形式で 返す必要があります。 オブジェクトをJSON形式の文字列に 変更するのは簡単です。 JSONオブジェクトのstringifyという メソッドを使用します。 ここにオブジェクトをそのまま渡してやれば、 例えば、このようにaとbという プロパティーを持ったオブジェクトを そのstringifyに渡してやると、 このように文字列でJSON化された形で 返してくれました。 これでレスポンスを作成することも できるでしょう。 ではヒントはここまでです。 ここでいったん動画の視聴をとめて、 皆さんで問題を解いてみて下さい。 いかがでしょう、問題は解けましたでしょうか。 それでは答え合わせです。 私の方で政界のプログラムを 書いていきたいと思います。 テキストエディタでプログラムを開きます。 program.js まずは、HTTPモジュールを ロードしましょう。 requireのhttp、 そして HTTPサーバーを作成して、リッスンします。 createHttpServer、 コールバックはrequestオブジェクトと、 responseオブジェクトを受け取ります。 そしてlisten、ポート番号は、 コマンドラインパラメーターから 受け取ります。 processのargv(2)を 数字として与えます。 そして受信数として解釈するので、 2番目のパラメーターに10を与えます。 さてそれでは、実際のハンドラの処理です。 まずはURLをパースしましょう。 URLのパースは、URLモジュールを使用します。 require(url)、 モジュールの中身は変数に格納しないで、 そのまま使ってしまいましょう。 parseのrequestのurl、 そして2番目のパラメーターに trueを与えることで、 クエリー文字列まで含めて、 オブジェクト化してくれます。 そしてこのHTTPサーバーは、二つの エンドポイントを持つということだったので、 urlのpathnameというプロパティーを見て、 処理を振り分けます。 pathnameが/api/parsetime という文字列だった場合には、 parsetimeの場合の動作、 もしくは、urlのpathnameが、 /api/unixtimeだった場合には、 unixtimeだった場合の動作。 あるいはそれ以外の場合には、 ここは仕様に記述されている部分では ありませんが、 どちらでもない場合には404、 すなわち、 そういったリソースさサーバー上に 存在しないという レスポンスを返しておきましょう。 response.writeHead(404).end()、 こうすることで、404のレスポンスを 返すことができます。 さてそれではparsetimeの場合の処理です。 parsetimeの場合には、 まずデートをパースしましょう。 デートのコンストラクターに与える変数は、 url.query.isoですね。 デートは一応スコープの宣言に、 移しておきましょう。 そしてデートのオブジェクトは、 こちらのunixtimeの方でも使うので、 こっちでもコピーしておきます。 そしてresponseがwriteHeadで、 200のステータスを返して、 さらに今回は、 content-typeヘッダーを、 application/jsonに指定します。 これもunixtimeの場合も同じなので、 コピー&ペーストしておきます。 そして最後にresponse.endで、 JSON化した文字列、 JSON.stringifyを使用します。 これを返します。 そのオブジェクトの中身は、 hourというプロパティーを持っており、 date.getHours、それから、 minuteというプロパティーを持っており、 それはgetMinutes、 そしてseconds、 これをdateのSeconds、 これでレスポンスの構築ができました。 一方で、unixtimeの場合には、 同じようにJSON.stringifyで、 オブジェクトを文字列にして返すのですが、 そのオブジェクトのプロパティーは、 unixtimeというプロパティーです。 ここにはdate.getTimeで、 unixtimeに変換したデートを渡します。 これでサーバーの記述は完了しました。 大きいプログラムなので、 何かミスがあるかもしれませんが、 一度検証してみましょう。 learnyounode verify program.js エラーがあった様です。 12行目ですね。 カッコの対応が とれていませんでしたね。 カッコが一つ足りませんでした。 こちらも同様です。 ではこれでカッコの対応が取れたので、 再度実行してみます。 ソースコードの編集に戻ります。 HTTPのcreateHttpServerではなく、 createServerでしたね。 修正して再度実行します。 今度は実行できましたが、 テストは失敗しています。 secondと返すところをsecondsという プロパティーで返してしまっていますね。 ここを修正します。 これでおそらく成功するはずです。 再度実行します。 minuteという単語のスペルが 間違っていました。 このようにプログラムが大きくなってくると、 実行した際に含まれるミスが その分増えてきますが、 くじけず修正する必要があります。 prgram.js、ここですね。 さて、では再度実行しましょう。 今度は成功しました。 このようにしてNode.jsを使えば、 JSONを返すHTTPのAPIサーバーの ようなものが、 比較的容易に作成することができます。 このレッスンでは、Node.jsで、 JSONレスポンスを返すHTTPサーバーを 作成する方法について学びました。

NodeSchoolに入学しよう!

NodeSchoolワークショッパーとは、オープンソースで開発されているNode.jsやJava Scriptについて学ぶためのクイズ形式のアプリケーションです。このコースでは、learnyounodeとexpressworksという2つのワークショッパーを通じてNode.jsとExpress.jsの基本的な使い方を学びます。

3時間13分 (24 ビデオ)
現在、カスタマーレビューはありません…
 
ソフトウェア・トピック
Node.js Node.js 0.10.24
価格: 3,990
発売日:2015年04月07日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。