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ではミドルウェアを使うことで簡単に対応することが可能です。
まずは、いろいろ試して見て使い方を確認していくのが良いかと思います。

