golang创建一个简单的restfulapi
你如今的气质里,藏着你走过的路,读过的书,和爱过的人。
Webからエンタープライズアプリケーションまで、RESTfulというアーキテクチャーが使われています。ステートレス設計として、別々のソフトウェアコンポーネント間の通信を提供する強力な方法であります。 Web開発者として、RESTful APIを作るために、主にPythonを使いますが、最近Goプログラミング言語に出会い、興味を持ってきました。Goプログラミング言語(golangでも呼ばれる)は、Googleのプロジェクトで、マイクロサービスアーキテクチャに適当な多くの機能も提供するので、人気が増えています。
本記事、golangを使ってシンプルなRESTful APIをどう作るか説明したいと思います。
仕様
RESTful APIは、通常CRUDができます。CRUDとは、データベースの四つの主要な機能、「作成(Create)」「読み出し(Read)」「更新(Update)」「削除(Delete)」ですが、今回は、簡単にするために、読み出しの機能しか作りません。そして、データがJSONの形式で書きます。
そして、このエンドポイントがあります:
- / -> ホームページですが、とりあえずテキストしかを見せない
- /items/ -> Itemのリスト、Itemデータを全部見せる
- /items/{id} -> 特定のItemの情報
それぞれのItemは、「title」と「description」のデータがあって、簡単にするために、データベースを使用するのではなく、データを事前に定義します。
開発プロセス
最初は、必要なパッケージをインストールします。ルーティングのために、Muxというパッケージを使っていきます。CMD / Terminalを開けて、このコマンドを実行してください:
1 | go get -u github.com/gorilla/mux |
その後、main.goというファイルを作成して、このコードを入れてください:
1 | package main |
すべてのgolangを使って作られたプログラムがパッケージで構成されています。この部分では、何のパッケージが必要かが書いてあります。この場合には、四つのパッケージが必要です。
ルーティング
同じファイルで、さっきの書いたコードの下に、このコードを入れてください:
1 | // Controller for the / route (home) |
main()
という関数は、このプログラムをスタートすると、自動的に実行されます。その中に、handleRequests()
という関数が実行されます。handleRequests()
の関数で、それぞれのエンドポイントがアクセスされると、何が起こるかが書いてあります。例えば、/のエンドポイントがアクセスされると、homePage
という関数が実行されるとか、/items
のエンドポイントがアクセスされると、returnAllItems
という関数が実行されます。
そして、このコード:
1 | log.Fatal(http.ListenAndServe(":8000", myRouter)) |
の意味は、このプログラムが8000のポートで、アクセスできます。これで、もう使えるなので、スタートしてみましょう!
CMD / Terminal で、このコマンドを実行してください:
1 | go run main.go |
サポート関数
これから、二つのパッケージが必要なので、インポートしましょう。最初のimport部分をこれに変更してください:
1 | import ( |
encoding/jsonとstrconvというパッケージを追加しました。もうすぐこの二つを使います。
それから、二つのサポート関数を書きましょう:
1 | func respondWithError(w http.ResponseWriter, code int, msg string) { |
両方の関数は、JSONの形式でHTTP requestに答える役割があります。
Itemデータ構造
Itemのデータ構造を書きましょう。importの部分の下に、このコードを入れてください:
1 | // Item representation |
仕様に基づいて、それぞれのItemは、「title」と「description」のデータがあります。そして、その下に、これを入れて下さい:
1 | // Global, static list of items |
今回は、データベースを使わないので、これでデータを事前に定義します。二つのItemだけ書きましたが、自由にいくつでもいいですよ。
コア関数
最後に、コア関数(returnAllItemsとreturnSingleItem)を書きます。
1 | // Controller for the /items route |
基本的に、/itemsのエンドポイントをアクセスすると、returnAllItems()という関数がすべてのItemをJSONの形式で答えます。
1 | // Controller for the /items/{id} route |
そして、returnSingleItem()
という関数が、idのURLパラメーターに基づいて特定のItemの情報をJSONの形式で答えます。
例えば、localhost:8000/items/1をアクセスしたら、1がidになります。それから、そのidは、indexとしてitemListという配列からデータを取ってJSONの形式で答えます。idは1の場合は、二つ目のデータが取られます。そして、idは0の場合は、一つ目のデータが取られます。
idは、数だけであるべきであり、Itemの数以上になってはいけないので、二つのチェックを書きました。これで、終わりです。作ってみましょう!
テスト
CMD / Terminal で、さっきのrunを閉じて、もう一回実行してください:
1 | go run main.go |