
【第4回】Go言語(Golang)入門~REST API環境構築編~
2020.08.21
第4回~Go言語(Golang)入門~

(株)ライトコードの笹川(ささがわ)です
今回も、Go言語(Golang)を習得していきたいと思います。
引き続き、Firestoreを利用して色々とやってみようかと思います。
Firestoreをデータストレージ、GolangをAPIとした場合は、どこかにデプロイしてから使うことが想定されます。
そのため、今回はデプロイする前にREST APIとして使えるようにしたいと思います。
ちなみに、RESTにした理由は特にありません(笑)
入門編のゴールとしては、Androidアプリとの結合を目論んでいるので、「RESTでいいなぁ」と難しいこと考えずに思った次第です!
前回の記事はこちら
こちらの記事もオススメ!
Webフレームワークを入れてみよう
「Go REST」などとGoogle検索すると、多くがWebフレームワークを利用した方法での記事が多いようです。
【参考サイト】
Go言語Webフレームワークランキング
今回、入門編ですので、上記の記事で上位として出ている「echo」を利用したいと思います。
【echoドキュメント】
https://echo.labstack.com/guide
ちなみに、選定理由としては、「ドキュメントが読みやすい」ことでした!
気軽に導入してみたいのに読みづらいのは選びにくいものです…
関連記事
また、「echo」については、こちらの記事もご覧ください。
main.go を修正
それでは、早速、上記ドキュメント通りに main.go を修正してみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323")) } |
書いたら、dep のおまじないを実行します。
1 | dep ensure |
labstackパッケージ が入っているかも確認します。
1 2 | $ ls vendor/github.com/ golang googleapis labstack mattn valyala |
実行
入ってることを確認したら、 go run で実行します。
1 2 3 4 5 6 7 8 9 10 11 | $ go run main.go ____ __ / __/___/ / ___ / _// __/ _ \/ _ \ /___/\__/_//_/\___/ v4.1.10 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\ ⇨ http server started on [::]:1323 |
おお、なんかいつもと動きが違いますね!
では、以下にアクセスしてみます。
http://localhost:1323

ちゃんとできているようです!
そういえば、SpringBootのときは、もう少し時間がかかった気がします。
こんなに楽だとは思わなかったです!
ルーティングをしてみよう
では、それぞれルーティングをしてみようと思います。
GET
まずは、GETからやります!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/users/:name", getUserName) e.Logger.Fatal(e.Start(":1323")) } func getUserName(c echo.Context) error { name := c.Param("name") return c.String(http.StatusOK, name) } |
http://localhost:1323/users/sasanori
と、リクエストすると
sasanori
と表示されるはずです。

成功しました!
GETで複数のパラメーター付与した場合
続いて、GETで複数のパラメーター付与した場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/show", show) e.Logger.Fatal(e.Start(":1323")) } func show(c echo.Context) error { team := c.QueryParam("team") member := c.QueryParam("member") return c.String(http.StatusOK, "team:"+team+", member:"+member) } |
http://localhost:1323/show?team=example&member=sasanori
でリクエストしてみます。
team:example, member:sasanori
と出れば成功です。

成功です!
POST
続けて、POSTを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.POST("/save", save) e.Logger.Fatal(e.Start(":1323")) } func save(c echo.Context) error { // Get name and email name := c.FormValue("name") email := c.FormValue("email") return c.String(http.StatusOK, "name:"+name+", email:"+email) } |
POSTなのでブラウザ以外からのリクエストをします。
今回は、curlではなく、「Postman」というツールを使ってリクエストします。
http://localhost:1323/save
に対して
application/x-www-form-urlencoded の name=sasanori, email=test@example.com
を付与したPOSTリクエストをします。

成功です!
name:sasanori, email:test@example.com
と表示されました。
ルーティングとデータの受け取りは、問題なくできそうです!
JSON形式で返してみましょう
REST APIですので、最終的には、JSON形式でのレスポンスを用意する必要があります。
ちなみに、Go言語(Golang)では、クラスという概念がありません。
そのため、構造体を利用し Json の取り扱いをすることが多いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package main import ( "net/http" "github.com/labstack/echo" ) type User struct { Name string `json:"name"` Email string `json:"email"` } func main() { e := echo.New() e.POST("/users", saveUser) e.Logger.Fatal(e.Start(":1323")) } func saveUser(c echo.Context) error { u := new(User) if err := c.Bind(u); err != nil { return err } return c.JSON(http.StatusOK, u) } |
http://localhost:1323/users
に対して
application/x-www-form-urlencoded の name=sasanori, email=test@example.com
を付与したPOSTリクエストをします。
確認
下記のようなレスポンスが来れば成功です!
1 2 3 4 | { "name": "sasanori", "email": "test@example.com" } |
想定通りのレスポンスです!

JSON形式で受け取って返す
それでは、JSON形式で受け取った値をそれぞれJSON形式で返してみましょう。
受け取り用の構造体を用意します。
1 2 3 4 5 | type Message struct { Name string `json:"name"` Email string `json:"email"` Message string `json:"message"` } |
レスポンス用の構造体を用意します。
1 2 3 4 5 6 | type Response struct { Name string `json:"name"` Email string `json:"email"` Message string `json:message` Stusts string `json:status` } |
パースしてレスポンスを返すようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package main import ( "net/http" "github.com/labstack/echo" ) type Message struct { Name string `json:"name"` Email string `json:"email"` Message string `json:"message"` } type Response struct { Name string `json:"name"` Email string `json:"email"` Message string `json:message` Stusts string `json:status` } func main() { e := echo.New() e.POST("/send", sendMessage) e.Logger.Fatal(e.Start(":1323")) } func sendMessage(c echo.Context) error { m := new(Message) if error := c.Bind(m); error != nil { return error } r := new(Response) r.Name = m.Name r.Email = m.Email r.Message = m.Message r.Stusts = "success" return c.JSON(http.StatusOK, r) } |
http://localhost:1323/send
に対して
application/x-www-form-urlencoded の name=sasanori, email=test@example.com, message=test message
を付与したPOSTリクエストをします。
確認
下記のようなレスポンスが来れば成功です。
1 2 3 4 5 6 | { "name": "sasanori", "email": "test@example.com", "Message": "test message", "Stusts": "success" } |
想定通りのレスポンスです!

第5回へつづく!
これで、APIとしての機能の実装の基本は完成しました。
でも、REST APIとして機能させるには、まだやることは沢山ありそうですね。
まだ構造体に不慣れなのと、Jsonパースあたりが正直怪しい。
そのため、今後はそこらへんも学習したいと思います。
データストレージとの結合やデプロイについて、また次回以降に書いていきますね。
なお、今回作成したgoファイルは、こちらのリポジトリにて管理しています。
Go言語でのシステム開発依頼・お見積もりはこちらまでお願いします。
また、Go言語を扱えるエンジニアを積極採用中です!詳しくはこちらをご覧ください。
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
第1回の記事はこちら
書いた人はこんな人

- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!
IT技術2022.04.18【Android】Webでよくみる入力Boxを手作り
IT技術2022.01.19【Android】SeekbarでスイッチなUIを作る
IT技術2020.03.24Androidのライブラリを作って公開してみた
IT技術2019.12.18【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~