Go言語でWeb APIサーバーを構築|echoで手軽に実装してみる
この記事では、Go言語の人気なWebフレームワーク「echo」を使って、Web APIサーバーを構築する方法を解説します。echoは、初めての方でも手軽に扱えるため、短時間でAPIサーバーを作成することが可能です。サーバー構築に興味あるかたは、ぜひお読みください。
Go言語とechoの概要
Go言語では標準ライブラリでもWebサーバーが作れる
Go言語には標準ライブラリとしてnet/http
が用意されていて、これを使うことでRESTアプリを作ることが可能です。
Go言語のフレームワークの多くはnet/http
のラッパーです。フレームワークを利用すると何が良いかというと、ミドルウェアにより、ログの記録、認証、圧縮、キャッシュなどの機能を簡単に追加できたり、ルーティングなどが簡単に行えたりすることができることです。
私は、簡単なものであればnet/http
で、それ以外はgin
でプログラムを作成していましたが、echo
の人気も高いようなので、この記事ではecho
を使って簡単なAPIサーバーを作成してみます。
echoのホームページ : https://echo.labstack.com/
echoの概要、メリットとデメリット
echo
フレームワークは、高パフォーマンス・拡張性・軽量を売りとしたWebフレームワークです。Go言語では、net/http
でも十分にプログラミングすることが可能ですが、その使いやすさとパフォーマンスからecho
を使う人も増えています。
以下、メリットとデメリットです
メリット
- 軽量で高速
echoはシンプルで高速です。パフォーマンスが高い(=Web APIの応答速度が速い)というのが一番のメリットです - シンプルで直感的
コーディングがシンプルで直感的なため、初心者でも扱いやすいです - ミドルウェアが充実
認証・ログ・リカバリーなど機能を追加するミドルウェアが揃っています。独自のミドルウェアによる拡張性も魅力です。
デメリット
- 機能が少ない
シンプルなため、フルスタックのフレームワーク(Revelなど)と比較すると、機能が少ないです - コミュニティの規模
他の人気フレームワークと比較すると、コミュニティの規模が小さいのがデメリットです。これについては、徐々に改善されてくると思われます。
基本シンプルだけど、拡張性もあるというのがecho
の大きな特徴だと言えます。
echo使ってスピーディにAPIサーバーを作成
ここでは、echo
を使ってAPIサーバーをサクッと作ってみます。
フォルダ設定とインストール
ここでは、echo-test
というフォルダを作り、その中で作業をすることにします。echo-test
に移動して、以下のコマンドを実行します。
$ go mod init echo-test
$ go get github.com/labstack/echo/v4
$ go get github.com/labstack/echo/v4/middleware
APIサーバーのプログラム
echo-test
フォルダ内に、以下の2つのファイルを作成します。
server.go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/labstack/gommon/log"
)
func hello(c echo.Context) error {
return c.File("index.html")
}
func main() {
// echo instance
e := echo.New()
// middleware
e.Use(middleware.RequestID())
e.Use(middleware.Logger())
// routes
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.GET("/hello", hello)
// Start server
e.Logger.Fatal(e.Start(":1323"))
}
処理の基本的な流れは以下のようになります。
- echoインスタンスの作成
echo.New()
でインスタンスを作成します。 - ミドルウェアの定義
利用するミドルウェアをUse
で追加します。ここでは、リクエストにIDをつけるRequestID
と、ログを出力するためのLogger
を登録しています。 - ルートの定義
ルートを定義します。ここでは、/
にアクセスした時と、/hello
にアクセスした時の関数を定義しています - サーバーの起動
サーバーを起動して、リクエストを待ちます
なお、/
にアクセスした時は、Hello, World!
という文字列を返します。また、/hello
にアクセスされた場合は、index.html
を返します。
基本的にはAPIを追加したい場合、e.GET(...)
を追加していきます。
index.html
/hello
にアクセスした時に表示されるHTMLファイルのサンプルです。
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Hello, World!</h1>
<h2>This is a test.</h2>
</body>
</html>
サーバーの起動
以下のコマンドでサーバーを起動します。
go run server.go
起動すると以下の画面が表示されます。
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.12.0
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:1323
ここで、Webブラウザからhttp://localhost:1323/
やhttp://localhost:1323/hello
にアクセスすると返答が返ります。
以上で、簡単なWeb APIサーバーが完成しました!コードもそれほどわかりにくくないと思います。とにかく簡単です。
ちなみに、Go言語の他のフレームワークも似たようなものが多いです。gin
も似た記述です。おそらく、標準ライブラリのnet/http
に似せて実装されているからだと思います。
REST APIからパラメータを受け取る
パラメータを受け取る方法です。パラメータの受け取り方法には、パスパラメータとクエリパラメータがあります。以下、それぞれについて解説します。
パスパラメータの受け取り
パスパラメータはURLのパスの一部をパラメータとするものです。例えば、
http://xxxxx.com/users/123
の123
の部分がユーザIDのパスパラメータになります。
echo
では、パスパラメータの受け取りは以下のようになります。
e.Get('/path/:text', path)
のように、:
をつけたパスをルートとして登録しておきます。関数(path()
)側では、c.Param("text")
のような形でパラメータを受け取ることができます。
例の場合は、http://localhost:1323/path/TEST
にアクセルするとTEST
をパラメータとして受け取ります。
// e.GET("/path/:text", path)
// http://localhost:1323/path/TEST
func path(c echo.Context) error {
name := c.Param("text")
return c.String(http.StatusOK, name)
}
クエリパラメータの受け取り
クエリパラメータは、URLの末尾に?
を付けてキーと値のペアとして受け取るものです。
e.Get("query", query)
のように、ルート登録は普通に行います。
パラメータの受け取りは、c.QueryParam("name")
のように行います。
例では、http://localhost:1323/query?name=TARO&age=20
とアクセスすると、name
にTARO
を、age
に20
を受け取ることができます。
// e.GET("/query", query)
// http://localhost:1323/query?name=TARO&age=20
func query(c echo.Context) error {
name := c.QueryParam("name")
age := c.QueryParam("age")
return c.String(http.StatusOK, name+":"+age)
}
まとめ
以上、echoの基本的な使い方について解説しました。実際にWebアプリを作るとCORSなどでトラブルことがあるかと思いますが、echo
ではミドルウェアを使うことで簡単に対応することが可能です。
まずは、いろいろ試して見て使い方を確認していくのが良いかと思います。