chicog.me

2022年1月23日
2022年1月23日

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