【第4回】Go言語(Golang)入門~REST API環境構築編~
IT技術
第4回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です
今回も、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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
笹川(エンジニア)
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
移転したライトコード大阪オフィスを調査せよ!
広告メディア事業部
2024.04.03
日常
【GCP】BIG QUERYを触り程度に理解してみる
かねまさ(エンジニア)
2024.04.02
IT技術
【Android】Github ActionsでFirebase Test Labの実行を分散する
笹川(エンジニア)
2024.04.02
IT技術
【Next.js】App Router で使用できるキャッシュまとめ
モーリー(エンジニア)
2024.03.29
IT技術
GitHubActionsのランナーに触れてみた
こやまん(エンジニア)
2024.03.28
IT技術