• トップ
  • ブログ一覧
  • 【第4回】Go言語(Golang)入門~REST API環境構築編~
  • 【第4回】Go言語(Golang)入門~REST API環境構築編~

    笹川(エンジニア)笹川(エンジニア)
    2019.10.02

    IT技術

    第4回~Go言語(Golang)入門~

    秋山笹川先生

    (株)ライトコードの笹川(ささがわ)です

    今回も、Go言語(Golang)を習得していきたいと思います。

    引き続き、Firestoreを利用して色々とやってみようかと思います。

    Firestoreをデータストレージ、GolangをAPIとした場合は、どこかにデプロイしてから使うことが想定されます。

    そのため、今回はデプロイする前にREST APIとして使えるようにしたいと思います。

    ちなみに、RESTにした理由は特にありません(笑)

    入門編のゴールとしては、Androidアプリとの結合を目論んでいるので、「RESTでいいなぁ」と難しいこと考えずに思った次第です

    前回の記事はこちら

    featureImg2019.09.26【第3回】Go言語(Golang)入門~Firestoreデータ操作編~第3回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です。今回でGo言語(Golang)...

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    Webフレームワークを入れてみよう

    「Go REST」などとGoogle検索すると、多くがWebフレームワークを利用した方法での記事が多いようです。

    【参考サイト】
    Go言語Webフレームワークランキング

    今回、入門編ですので、上記の記事で上位として出ているechoを利用したいと思います。

    【echoドキュメント】
    https://echo.labstack.com/guide

    ちなみに、選定理由としては、「ドキュメントが読みやすい」ことでした!

    気軽に導入してみたいのに読みづらいのは選びにくいものです…

    関連記事

    また、「echo」については、こちらの記事もご覧ください。

    featureImg2019.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言語を扱えるエンジニアを積極採用中です!詳しくはこちらをご覧ください。

    次回の記事はこちら

    featureImg2019.10.09【第5回】Go言語(Golang)入門~REST API実装編~第5回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!前回は、RESR APIを構築...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事