- 公開日:2016年05月28日
記事概要
APIサービスをRailsでなく、GoLangで作ることを検証しました。
その検証内容をまとめた記事です。
環境
- Centos6.5
- Go 1.6.2
- Nginx 1.8.1
初めに
スマートフォンアプリ用のAPIサービスをRailsでなく、GoLangで作るかどうかを検証しました。
以下が、最低限必要な検証項目です。
- centos6.5にgolangをインストール(済)
- golangでサーバーを動かす。(済)
- nginx経由でgolangサーバーにアクセスする。(済)
- golangでAPIを叩いてjsonを返却する
- mysqlに接続する。
- ログを吐き出す。
今回は、言語仕様や文法の基礎的なことは、学習しません。
長く使えそうな言語ならやっていきます。
ダメな場合の候補は、Rails, Spring, djangoです。
前回の記事で「nginx経由でgolangサーバーにアクセス」したので、今回はgolangでjsonを扱います。
golangでjson
ここでは、以下のjsonを返すAPIを作成します。
{ "last_updated_at": "yyyy-MM-dd HH:mm:ss", "master": [{ "id": 1, "name": "news", "summmey": "news contents", "category": "economic" }, { "id": 2, "name": "sports", "summmey": "news contents", "category": "baseball" } ] }
サンプルなので、スマホアプリによくある典型的なjsonにしました。
jsonの処理はjsonパッケージを使います。
Struct
Golangでjsonを使う場合は、structの知識が必要になります。
使い方は、C言語系のstructとほぼ同じです。JavaやRubyのクラスともほぼ同じです。
typeはinterfaceとしても宣言できますが、この記事では必要ないので説明しません。
サーバーの変更
Golangのサーバーの処理でjsonを返却するには、以下のコードを追加します。
res.Header().Set("Content-Type", "application/json")
これでjsonが返却可能になります。
jsonの実装
Golangのhandler関数でjsonの処理を以下のように追加します。
package main import ( "fmt" "net" "net/http" "net/http/fcgi" "encoding/json" ) type Sample struct { Master []Master `json:"master"` LastUpdateAt string `json:"last_updated_at"` } type Master struct { Id string `json:"id"` Name string `json:"name"` Summmey string `json:"summmey"` Category string `json:"category"` } func viewHandler(res http.ResponseWriter, req *http.Request) { res.Header().Set("Content-Type", "application/json") master1 := Master {"1","master1","sum1","cat1"} master2 := Master {"2","master2","sum2","cat2"} // 配列 masters := []Master{master1, master2} sample1 := Sample{Master: masters, LastUpdateAt: "2016/07/01 20:11:11"} resJson, _ := json.Marshal(sample1) fmt.Fprintf(res, string(resJson)) } func main() { l, err := net.Listen("tcp", "127.0.0.1:8190") if err != nil { return } http.HandleFunc("/", viewHandler) fcgi.Serve(l, nil) }
コードの説明をします。
1. Sample struct
type Sample struct { Master []Master `json:"master"` LastUpdateAt string `json:"last_updated_at"` }
json全体の
{ "last_updated_at": "yyyy-MM-dd HH:mm:ss", "master": [] }
を表現する構造体です。
2. Master struct
type Master struct { Id string `json:"id"` Name string `json:"name"` Summmey string `json:"summmey"` Category string `json:"category"` }
jsonの
{ "id": 1, "name": "news", "summmey": "news contents", "category": "economic" }
を表現する構造体です。
3. Json出力
master1 := Master {"1","master1","sum1","cat1"} master2 := Master {"2","master2","sum2","cat2"} // 配列 masters := []Master{master1, master2} sample1 := Sample{Master: masters, LastUpdateAt: "2016/07/01 20:11:11"} resJson, _ := json.Marshal(sample1)
Masterの配列データを作成し、Sampleの構造体を作成します。json.Marshalという関数を使うことで、jsonデータを取得できます。
実行
go run sample.go
ブラウザでhttp://localhost/golangにアクセスします。
画面が表示されました。
まとめ
GoLangでjsonを扱うのは、色々な方法が用意されています。
この記事で記述した内容は、java, php, ruby, python等のコーディングに慣れている人にはわかりやすいのではないでしょうか。
まずは、他言語風の実装に慣れてから、リファクタリングで徐々にGoLangに適したコーディングスタイルにすれば良いのではないでしょうか。
以上。
0 件のコメント:
コメントを投稿