2016年5月28日土曜日

【Golang】初めてのGolang 本番への導入を検証する その3 json

  • 公開日:2016年05月28日

記事概要

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を作成します。

{project_folder}/src/sample.go
{
  "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を返却するには、以下のコードを追加します。

{project_folder}/src/sample.go

res.Header().Set("Content-Type", "application/json")

これでjsonが返却可能になります。

jsonの実装

Golangのhandler関数でjsonの処理を以下のように追加します。

{project_folder}/src/sample.go
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データを取得できます。

実行

terminal

go run sample.go

ブラウザでhttp://localhost/golangにアクセスします。

画面が表示されました。

まとめ

GoLangでjsonを扱うのは、色々な方法が用意されています。
この記事で記述した内容は、java, php, ruby, python等のコーディングに慣れている人にはわかりやすいのではないでしょうか。

まずは、他言語風の実装に慣れてから、リファクタリングで徐々にGoLangに適したコーディングスタイルにすれば良いのではないでしょうか。

以上。

PICK UP オススメ書籍

運営サイト(railsで作成しています)

関連記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...