#環境
Go :go version go1.6.2 darwin/amd64
IDE :VSCode1.1.0
echo:Echo v2.(beta)
俺 :Go初めて2日目
間違ってたらすみません。コメントなどで教えて下さい。
#Echoとは:
GolangのWebフレームワーク。
特徴として:
・リソースの量に比例して全体のスループットが向上するシステム(スケーラブル)でプログラムの外乱に対する抵抗性のある(ロバスト)なRESTAPIを作れる。
・スタンダードなHTTPサーバ(またはFastHTTPサーバ)で動作する
・URI (PATH)単位でなにか処理を入れられます
・ミドルウェアに対して拡張性がある。
・urlごとにログ出したり出さなかったりすることできる
・JSON,XML,フォームペイロードなどへのデータバインディングのサポートがある
・HTTPの様々なレスポンスを送るための使いやすい関数をサポート
・どんなテンプレートエンジンででもテンプレートレンダリングできる
・Loggerに対して任意の定義を行える
・カスタマイズ性が高い
RESTAPI向けに最適化されているフレームワーク
RESTAPIとは:
RESTの原則に沿った形で設計されたAPI
RESTとは:
・セッションなどの状態管理を行わない
・情報を操作する命令の体系が予め定義・共有されている(HTMLのPostやGetなど)
・すべての情報は汎用的な構文で一意に識別される(URLやURIなど)URL∈URI
#Echo-HelloWorld.
package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/labstack/echo/engine/standard"
"github.com/labstack/echo/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Route => handler
e.GET("/hoge", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello,World");
})
e.GET("/piyo", func(c echo.Context) error {
return c.String(http.StatusOK, "こんにちは世界");
})
// Start server
e.Run(standard.New(":1323"))
}
##package mainとImport
main関数を用いているため、Packageはmainにする必要がある。
fmtパッケージ
フォーマットI/Oを実装している。ScanとかPrintとかできるのはこいつのおかげ。
##main関数内
インスタンス作成
e := echo.New()
Echoのインスタンス化
ミドルウェアの使用宣言(Logger)
e.Use(middleware.Logger())
デフォルトで存在するロガー
HTTPのリクエストをログとってくれて、コンソールに出力してくれる。↓
time=2016-05-10T10:19:49+09:00, remote_ip=::1, method=GET, uri=/up, status=200, took=6.09µs, sent=7 bytes
Time,Remote_IP,uri,method,path,status,response_time,response_sizeを出力してくれる。
ミドルウェアの使用宣言(Recover)
e.Use(middleware.Recover())
middleware.Recoverのコメントを見ると
Recover()はどこかでパニック(エラー)が起きたらそこから復帰したり、中央化されてるHTTPErrorHandlerを制御するミドルウェア。
少しRecover.goを見るとDefaultRecoverConfigというデフォルトの設定ででどのように復帰するかが書かれている。
まずどのようなエラーが出たのかを検査し、recover()をする。その時帰ってくる型がerrorだった場合とそうでない場合がある。
そうでない場合にはErrorとして扱われるように整形する。
その後、どちらの場合に対してもLoggerに対してエラー内容を出力する。その上でContextにErrorを格納する。
そのErrorをHandlerFuncに引数として渡し、それをReturnしている。
エラー出力をしつつ、エラーの内容をキャッチしてRecoverするミドルウェアであり、その使用を宣言している。
ページのコンテンツの作成
return c.String(http.StatusOK, "Hello,World");
})
http://localhost:1323/hoge に対してHelloWorldを表示してる。
e.GETの引数として
”/hoge”:パス
func(c echo.Context):該当のリクエスト/レスポンスの情報が格納されるハンドラー
mainの中{
e.GET("/piyo", hello)
}
func hello(c echo.Context) error {
return c.String(http.StatusOK, "こんにちは世界");
}
と同等。こっちのほうが理解がしやすいと思う。
サーバ起動
e.Run(standard.New(":1323"))
サーバーを起動。
ターミナルでgo run sampleserver.go
した後にブラウザでhttp://localhost:1323 にアクセスできるようになる。
今回はe.GETを2つ用意してあるのでそれぞれ
localhost:1323/hoge
localhost:1323/piyo
でそれぞれHello,World、こんにちは世界が出力される