- 公開日: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 件のコメント:
コメントを投稿