chicog.me

Go言語で簡単なWebサーバ、APIサーバを構築!

タイトルにもありますように、今回はGo言語を使ってJSONを返却するAPIサーバを構築していきたいと思います!

環境

  • goenv
  • go 1.16.5

まずは準備!

モジュールモードでの開発を行いたいので、以下のコマンドを実行しモジュールモードで開発を行う準備を進めていきます。

mkdir api
cd api

# api の部分はお好きなmodule名で!
go mod init api

そうすると下記の内容のgo.modというファイルが出来上がります。

module api

go 1.16

実行ファイルを作成

今回は、とりあえずJSONを返せればよいので以下の内容のmain.goを作成していきます。

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)

// `json:"id"`の記載がなくてもJSON形式で返却されるが、キー名のままだと困る場合はスネークケースなどに直すことができる
type Page struct {
    ID    int    `json:"id"`
    Title string `json:"title"`
    Url   string `json:"url"`
}

// Pageの配列リテラル(本来はDBから返却された値で埋めていく)
var pages = []Page{{
    ID:    1,
    Title: "The Go Programming Language",
    Url:   "https://golang.org/",
},
    {
        ID:    2,
        Title: "A Tour of Go",
        Url:   "https://go-tour-jp.appspot.com/welcome/1",
    },
}

// JSON返却用の構造体
type PageJSON struct {
    Status int `json:"status"`
    Pages  *[]Page
}

// ただただ文字列「Hello, World」を返却するハンドラー
func indexHandler(w http.ResponseWriter, r *http.Request) {
    _, err := fmt.Fprint(w, "Hello, World")
    if err != nil {
        return
    }
}

// appilication/jsonでJSONっぽい値を返却するハンドラー
func pagesHandler(w http.ResponseWriter, r *http.Request) {

    var pj PageJSON
    pj.Status = 200
    pj.Pages = &pages

    var buf bytes.Buffer
    enc := json.NewEncoder(&buf)
    if err := enc.Encode(&pj); err != nil {
        log.Fatal(err)
    }
    fmt.Println(buf.String())

    // Content-Typeを設定
    w.Header().Set("Content-Type", "application/json;charset=utf-8")

    // Responseに書き込み
    _, err := fmt.Fprint(w, buf.String())
    if err != nil {
        return
    }
}

func main() {

    // text/plain返却 "/" のとき indexHandlerを実行する
    http.HandleFunc("/", indexHandler)

    // application/json返却 "/pages"の時 pagesHandlerを返却
    http.HandleFunc("/pages", pagesHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

あとは、go run main.goを実行することにより「8080」を待ち受ける状態となるので以下のURLで期待結果が返却されるか確認してみてください!

localhost:8080

# 期待結果
Hello, World

localhost:8080/pages

# 期待結果
{"status":200,"Pages":[{"id":1,"title":"The Go Programming Language","url":"https://golang.org/"},{"id":2,"title":"A Tour of Go","url":"https://go-tour-jp.appspot.com/welcome/1"}]}

なお、修正をした場合は一度停止してから再度「go run main.go」とすることにより修正内容が反映されます。 Airなどのホットリロードをできるようにするパッケージもありますので導入してみてもよいと思います。

以下に公開しています! https://github.com/chicoweb0624/go-http-sample

参考URL

[初心者向け] Golang でシンプルな JSON API を作る - zenn.dev