【第4回】Go言語(Golang)入門~REST API環境構築編~
IT技術
(株)ライトコードの笹川(ささがわ)です
今回も、Go言語(Golang)を習得していきたいと思います。
引き続き、Firestoreを利用して色々とやってみようかと思います。
Firestoreをデータストレージ、GolangをAPIとした場合は、どこかにデプロイしてから使うことが想定されます。
そのため、今回はデプロイする前にREST APIとして使えるようにしたいと思います。
ちなみに、RESTにした理由は特にありません(笑)
入門編のゴールとしては、Androidアプリとの結合を目論んでいるので、「RESTでいいなぁ」と難しいこと考えずに思った次第です!
前回の記事はこちら
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
Webフレームワークを入れてみよう
「Go REST」などとGoogle検索すると、多くがWebフレームワークを利用した方法での記事が多いようです。
【参考サイト】
Go言語Webフレームワークランキング
今回、入門編ですので、上記の記事で上位として出ている「echo」を利用したいと思います。
【echoドキュメント】
https://echo.labstack.com/guide
ちなみに、選定理由としては、「ドキュメントが読みやすい」ことでした!
気軽に導入してみたいのに読みづらいのは選びにくいものです…
関連記事
また、「echo」については、こちらの記事もご覧ください。
2019.05.23Go言語のおすすめフレームワーク5選Go言語のおすすめフレームワークを詳しく知りたい!ミツオカ「Go言語」って、急速に人気が出てきていますよね! にゃんこ...
main.go を修正
それでは、早速、上記ドキュメント通りに main.go を修正してみましょう!
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9func main() {
10 e := echo.New()
11 e.GET("/", func(c echo.Context) error {
12 return c.String(http.StatusOK, "Hello, World!")
13 })
14 e.Logger.Fatal(e.Start(":1323"))
15
16}
書いたら、dep のおまじないを実行します。
1dep ensure
labstackパッケージ が入っているかも確認します。
1$ ls vendor/github.com/
2golang googleapis labstack mattn valyala
実行
入ってることを確認したら、go run で実行します。
1$ go run main.go
2
3 ____ __
4 / __/___/ / ___
5 / _// __/ _ \/ _ \
6/___/\__/_//_/\___/ v4.1.10
7High performance, minimalist Go web framework
8https://echo.labstack.com
9____________________________________O/_______
10 O\
11⇨ http server started on [::]:1323
おお、なんかいつもと動きが違いますね!
では、以下にアクセスしてみます。
http://localhost:1323
ちゃんとできているようです!
そういえば、SpringBootのときは、もう少し時間がかかった気がします。
こんなに楽だとは思わなかったです!
ルーティングをしてみよう
では、それぞれルーティングをしてみようと思います。
GET
まずは、GETからやります!
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9func main() {
10 e := echo.New()
11 e.GET("/users/:name", getUserName)
12 e.Logger.Fatal(e.Start(":1323"))
13
14}
15
16func getUserName(c echo.Context) error {
17 name := c.Param("name")
18 return c.String(http.StatusOK, name)
19}
http://localhost:1323/users/sasanori
と、リクエストすると
sasanori
と表示されるはずです。
成功しました!
GETで複数のパラメーター付与した場合
続いて、GETで複数のパラメーター付与した場合です。
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9func main() {
10 e := echo.New()
11 e.GET("/show", show)
12 e.Logger.Fatal(e.Start(":1323"))
13}
14
15func show(c echo.Context) error {
16 team := c.QueryParam("team")
17 member := c.QueryParam("member")
18 return c.String(http.StatusOK, "team:"+team+", member:"+member)
19}
http://localhost:1323/show?team=example&member=sasanori
でリクエストしてみます。
team:example, member:sasanori
と出れば成功です。
成功です!
POST
続けて、POSTを実装します。
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9func main() {
10 e := echo.New()
11 e.POST("/save", save)
12 e.Logger.Fatal(e.Start(":1323"))
13}
14
15func save(c echo.Context) error {
16 // Get name and email
17 name := c.FormValue("name")
18 email := c.FormValue("email")
19 return c.String(http.StatusOK, "name:"+name+", email:"+email)
20}
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 の取り扱いをすることが多いです。
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9type User struct {
10 Name string `json:"name"`
11 Email string `json:"email"`
12}
13
14func main() {
15 e := echo.New()
16 e.POST("/users", saveUser)
17
18 e.Logger.Fatal(e.Start(":1323"))
19}
20
21func saveUser(c echo.Context) error {
22 u := new(User)
23 if err := c.Bind(u); err != nil {
24 return err
25 }
26 return c.JSON(http.StatusOK, u)
27}
http://localhost:1323/users
に対して
application/x-www-form-urlencoded の name=sasanori, email=test@example.com
を付与したPOSTリクエストをします。
確認
下記のようなレスポンスが来れば成功です!
1{
2 "name": "sasanori",
3 "email": "test@example.com"
4}
想定通りのレスポンスです!
JSON形式で受け取って返す
それでは、JSON形式で受け取った値をそれぞれJSON形式で返してみましょう。
受け取り用の構造体を用意します。
1type Message struct {
2 Name string `json:"name"`
3 Email string `json:"email"`
4 Message string `json:"message"`
5}
レスポンス用の構造体を用意します。
1type Response struct {
2 Name string `json:"name"`
3 Email string `json:"email"`
4 Message string `json:message`
5 Stusts string `json:status`
6}
パースしてレスポンスを返すようにします。
1package main
2
3import (
4 "net/http"
5
6 "github.com/labstack/echo"
7)
8
9type Message struct {
10 Name string `json:"name"`
11 Email string `json:"email"`
12 Message string `json:"message"`
13}
14
15type Response struct {
16 Name string `json:"name"`
17 Email string `json:"email"`
18 Message string `json:message`
19 Stusts string `json:status`
20}
21
22func main() {
23 e := echo.New()
24 e.POST("/send", sendMessage)
25 e.Logger.Fatal(e.Start(":1323"))
26}
27
28func sendMessage(c echo.Context) error {
29 m := new(Message)
30 if error := c.Bind(m); error != nil {
31 return error
32 }
33 r := new(Response)
34 r.Name = m.Name
35 r.Email = m.Email
36 r.Message = m.Message
37 r.Stusts = "success"
38 return c.JSON(http.StatusOK, r)
39}
http://localhost:1323/send
に対して
application/x-www-form-urlencoded の name=sasanori, email=test@example.com, message=test message
を付与したPOSTリクエストをします。
確認
下記のようなレスポンスが来れば成功です。
1{
2 "name": "sasanori",
3 "email": "test@example.com",
4 "Message": "test message",
5 "Stusts": "success"
6}
想定通りのレスポンスです!
第5回へつづく!
これで、APIとしての機能の実装の基本は完成しました。
でも、REST APIとして機能させるには、まだやることは沢山ありそうですね。
まだ構造体に不慣れなのと、Jsonパースあたりが正直怪しい。
そのため、今後はそこらへんも学習したいと思います。
データストレージとの結合やデプロイについて、また次回以降に書いていきますね。
なお、今回作成したgoファイルは、こちらのリポジトリにて管理しています。
Go言語でのシステム開発依頼・お見積もりはこちらまでお願いします。
また、Go言語を扱えるエンジニアを積極採用中です!詳しくはこちらをご覧ください。
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!