2022年1月23日
2022年10月2日
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で期待結果が返却されるか確認してみてください!
# 期待結果
Hello, World
# 期待結果
{"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
などのホットリロードをできるようにするパッケージもありますので導入してみてもよいと思います。