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

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

    IT技術

    秋山笹川先生

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

    今回も、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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)
    笹川(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background