Web APIアプリケーションを構築する
ここまでの説明で、「Gojiを利用したWebアプリケーションのルーティングとハンドラの書き方」「構造体とJSONフォーマットのマッピング」「gorp
によるデータベース操作」という、Webアプリケーション構築に必要な3つの要素がそろいました。最後に、これらの要素を組み合わせてシンプルなWeb APIアプリケーションを作成してみます。
完成したコードはGistのこのページにアップロードしています。簡易的なものとはいえども、データベース操作を伴うWeb APIアプリケーションが100行に満たないコードで実現できました。
Eclipseに新しいプロジェクト「goji_api」を作成して、完成したコードをビルドしてみましょう。「src」の下に「goji_api」フォルダを作成し、その下に「main.go」ファイルを作成して、完成したコードの内容をコピーして貼り付けます。MySQL接続文字列の username
や password
などの部分は、各自の環境に合わせて書き換えてください。
実行ファイル「goji_api.exe」が生成されれば成功です。さっそく実行してみましょう。データベースへの接続情報に問題がなければサーバ処理が開始されます。
まずはユーザの情報を取得するAPIを呼び出します。ID = 1
であるユーザの情報を取り出す場合のURLは下記のようになります。
http://localhost:8000/user/1
GET
メソッドでアクセスするAPIなので、Webブラウザ上から直接参照することができます。
JSONデータが正しく返されることが確認できました。
次に新規ユーザの情報を登録するAPIを呼び出すのですが、こちらは POST
メソッドが前提であるため、Webブラウザからの単純なアクセスが難しくなっています。そこで curl
コマンドを使ってアクセスします。Git for Windowsを導入しているのであれば、そのオマケとしてコマンドプロンプトから呼び出せるようになっているはずです。今回は curl
コマンドを下記のような形式で使用します。
C:¥> curl -d "name=Yamada Hanako" -d "email=hanako@example.com" http://localhost:8000/user
-d
オプションを複数個並べて、APIが要求するパラメータ name
と email
をAPIのパス「/user」へ送信しています。ユーザ名を日本語にしたいところなのですが、通常のコマンドプロンプトから「UTF-8」エンコーディングでパラメータを送信することが難しいため、全てASCII範囲の文字のみを使用しています。
成功すると、データベースに保存された内容がJSONフォーマットで出力されます。新しく登録したユーザに ID = 30
が割り当てられたことが確認できました。もう一度、前のAPIに戻って ID = 30
のユーザ情報をWebブラウザから参照しましょう。
正しく登録されていることが確認できました!
完成したコードのポイント
最後に、完成したコードのポイントをいくつか解説してみます。
User
構造体の定義では、テーブルへのマッピングのための db
タグと、JSONへのマッピングのための json
タグの両方を付加しています。
type User struct { Id int `db:"id" json:"id"` Name string `db:"name" json:"name"` Email string `db:"email" json:"email"` CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` }
POST
メソッドで呼び出されるハンドラ内でフォームデータを取得するには、次のように r.ParseForm()
を呼び出してから r.FormValue("key")
で取り出します。GET
メソッドの場合と違って少々複雑な仕組みになっています。
r.ParseForm() u := User{Name: r.FormValue("name"), Email: r.FormValue("email"), CreatedAt: time.Now(), UpdatedAt: time.Now()}
何らかのエラーが発生した場合には http.Error()
を使用して任意のステータスコードを返すことができます。「パラメータで指定されたIDに対応するユーザが存在しない」という意味を表すために 404
のステータスコードを返しています。
if err != nil { http.Error(w, "Not found", 404) } else { renderUser(w, &u) }
おわりに
GoによるWeb APIアプリケーション開発について解説してみましたが、いかがでしたでしょうか。2009年に登場した、まだ年若いこのプログラミング言語は最近著しい成長を遂げています。各所での採用事例も増えており、特にコンテナ型仮想化ツールの「Docker」がGoで書かれていることは有名です。
今後も、その適用領域を広げていくであろうと思われるGoに、1人でも多くの開発者が触れてほしいと祈りつつ解説を終わります。