プログラミング
記事内に商品プロモーションを含む場合があります

Go言語でWeb APIサーバーを構築|echoで手軽に実装してみる

Aru

この記事では、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"))
}

処理の基本的な流れは以下のようになります。

  1. echoインスタンスの作成
    echo.New()でインスタンスを作成します。
  2. ミドルウェアの定義
    利用するミドルウェアをUseで追加します。ここでは、リクエストにIDをつけるRequestIDと、ログを出力するためのLoggerを登録しています。
  3. ルートの定義
    ルートを定義します。ここでは、/にアクセスした時と、/helloにアクセスした時の関数を定義しています
  4. サーバーの起動
    サーバーを起動して、リクエストを待ちます

なお、/にアクセスした時は、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とアクセスすると、nameTAROを、age20を受け取ることができます。

// 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ではミドルウェアを使うことで簡単に対応することが可能です。

まずは、いろいろ試して見て使い方を確認していくのが良いかと思います。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました