記事概要
APIサービスをRailsでなく、GoLangで作ることを検証しました。
その検証内容をまとめた記事です。
環境
- Centos6.5
- Go 1.6.2
- Nginx 1.8.1
初めに
スマートフォンアプリ用のAPIサービスをRailsでなく、GoLangで作るかどうかを検証しました。
以下が、最低限必要な検証項目です。
今回は、言語仕様や文法の基礎的なことは、学習しません。
長く使えそうな言語ならやっていきます。
ダメな場合の候補は、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に適したコーディングスタイルにすれば良いのではないでしょうか。
以上。
PICK UP オススメ書籍
Mat Ryer オライリージャパン 2016-01-22
運営サイト(railsで作成しています)
関連記事
この記事がお役にたちましたらシェアをお願いします