Go言語でAPIサーバーを建てたいときに便利なフレームワークがechoです。
- 堅牢でスケーラブルなRESTful APIの構築
- 高いカスタマイズ性
- 拡張可能なミドルウェアフレームワーク
echoには上記のような特徴があり、比較的簡単にAPIサーバーを立てることができます。
この記事では、サンプルコードを用いてechoを使用たAPIサーバーを立てる方法を解説します。

私が所属しているチームの開発でもGo言語とechoを採用しています!
記事内でのサンプルはGitHubにあげておきましたのでご自由にお使いください。
echoとは? – 簡単にAPIを構築できるGo言語のフレームワーク
echoとは、オープンソースで開発されているGo言語のフレームワークです。

APIサーバーを構築するために必要な機能が揃っており、シンプルなので学習コストが低く開発を始めることができます。

解説はこの辺にして実際に使って試していきましょう!
echoのインストール方法
以下のコマンドでインストールします。1コマンドでインストールは完了です。
$ go get github.com/labstack/echo/v4
echoでGetのAPIを実装する方法
それではGetのAPIを実装していきます。以下がGET APIを実装したサンプル実装です。
main.go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// echoインスタンスを生成
e := echo.New()
// Middleware
// httpリクエストの情報をログに表示
e.Use(middleware.Logger())
// パニックを回復し、スタックトレースを表示
e.Use(middleware.Recover())
// ルーティング
e.GET("/", getSample)
// サーバーをスタートさせる
// ポート番号は引数で指定できる
e.Logger.Fatal(e.Start(":8080"))
}
// Get API
func getSample(c echo.Context) error {
return c.String(http.StatusOK, "Get!")
}
起動してみます。echoという文字とともにサーバーが立ち上がりました。
$ go run main.go
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.5.0
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:8080
curlで確認します。
$ curl 'http://localhost:8080/'
以下がレスポンスとして返却されることが確認できました。
Get!

APIリクエストがあった際の処理や、返却するレスポンスは自由に設定できます!
echoでPostのAPIを実装する方法
次はPostのAPIを実装します。Postの実装は以下の記述をmain.goに追加します。
// mainメソッドのルーティングに追加
e.POST("/post", postSample)
// mainメソッド外に追加
// Handler
func postSample(c echo.Context) error {
// Postの処理
return c.String(http.StatusOK, "Post!")
}
curlで確認します。
$ curl -X POST 'http://localhost:8080/post'
以下がレスポンスとして返却されたら成功です。
Post!
リクエストのURLパラメーターを受け取る方法
URLパラメーターを受け取る場合は Param を使用します。
// mainメソッドのルーティングに追加
e.POST("/post/:id", postSample)
// mainメソッド外に追加
// Handler
func postSample(c echo.Context) error {
// URLパラメーター受け取り
id, _ := strconv.Atoi(c.Param("id"))
msg := fmt.Sprintf("url param %v", id)
return c.String(http.StatusOK, msg)
}
curlで確認します。レスポンスにURLパラメーターで渡したIDが確認できます。
$ curl -X POST 'http://localhost:8080/post/1'
url param 1
リクエストのクエリパラメーターを受け取る方法
エリパラメーターを受け取る場合は QueryParam を使用します。
hoge := c.QueryParam("hoge")
リクエストボディを受け取る方法
リクエストボディを受け取る方法は、ボディとして渡されるjsonに合わせて構造体を用意して Bind を使用します。
// 受け取るための構造体
type post struct {
ID int `json:"id"`
Name string `json:"name"`
}
// mainメソッドのルーティングに追加
e.POST("/post/:id", postSample)
// Handler
func postSample(c echo.Context) error {
p := new(post)
if err := c.Bind(p); err != nil {
log.Printf("err %v", err.Error())
return c.String(http.StatusInternalServerError, "Error!")
}
// URLパラメーターはBindで入らない
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
log.Printf("err %v", err.Error())
return c.String(http.StatusInternalServerError, "Error!")
}
p.ID = id
msg := fmt.Sprintf("id: %v, name %v", p.ID, p.Name)
return c.String(http.StatusOK, msg)
}
curlで確認します。レスポンスに送信したパラメーターが出力されていますね。
$ curl -X POST -H 'Content-Type: application/json' -d '{"name":"taro"}' localhost:8080/post/1
id: 1, name taro
Put, DeleteのAPIを実装する方法
Put, Deleteに関しても以下のようにルーティングを定義することで実装可能です。
e.PUT(<Path>, <メソッド名>)
e.DELETE(<Path>, <メソッド名>)
レスポンスの返却方法
レスポンスは、return部分にステータスコードと返却する内容を指定します。
単純な文字列を返却する場合は String を使用します。
return c.String(http.StatusOK, "Get!")
JSONを返却したい場合は JSON を使用します。返却するJSONの内容は構造体に詰めます。
// 構造体
type post struct {
ID int `json:"id"`
Name string `json:"name"`
}
// ルーティング(main内)
e.GET("/sample", getResponseSample)
// Handler
func getResponseSample(c echo.Context) error {
p := &post{
ID: 1,
Name: "taro",
}
return c.JSON(http.StatusOK, p)
}

今回の記事はここまでです。
Go言語の入門にはスターティングGo言語やUdemyがおすすめです!
コメント