net/httpでパスパラメータが取得できない件
GoでWebアプリやAPIを開発する時には、Goの標準パッケージであるnet/httpを使うことができる。
JavaやPythonなどの他の言語だと、WebフレームワークやAPI開発のフレームワークを使う必要がある一方で、Goではサードパーティーのライブラリを使う必要がないというのだから、それはそれは便利である。
しかし、net/httpを実際に使ってみて感じた最大のデメリットは、パスパラメータが取得できないということだ。
パスパラメータはアプリを開発するのであれば、99%取得する必要が出てくるだろう。これは困ったというのが事実だが、話は簡単。無いのであれば作ればいい。
そこで今回は、Goのnet/httpでパスパラメータを取得するための実装をしてみた。
※なお、クエリパラメータやボディパラメータ、さらにはHTTPメソッド(GETなのかPOSTなのかの情報)については、取得する機能が存在する。やり方は割愛するのでググっていただきたい。
パスパラメータを取得するコード
/item/{itemId} のようなエンドポイントで {itemId} 部分をパスパラメータとして抽出する簡単な例を以下に示す。
package main
import (
"fmt"
"net/http"
"strings"
)
func itemHandler(w http.ResponseWriter, r *http.Request) {
// URLのPath部分を"/"で分割
parts := strings.Split(r.URL.Path, "/")
// 期待するパスが "/item/{itemId}" 形式であるため、
// 配列の3番目の要素が itemId になる。
// URLが /item/123 の場合、parts は ["", "item", "123"] になる。
if len(parts) < 3 {
http.Error(w, "Invalid request", http.StatusBadRequest)
return
}
itemId := parts[2]
// itemIdを使用した処理
fmt.Fprintf(w, "Item ID: %s", itemId)
}
func main() {
http.HandleFunc("/item/", itemHandler) // HandleFunc にパスを登録
fmt.Println("Server is starting...")
http.ListenAndServe(":8080", nil)
}
こう見ると比較的簡単に実装できると感じたのではないだろうか?いやいや、やっぱめんどくせえよって感じた方は、ここで離脱せずに次の章を見てほしい。
より便利なルーティング機能やパスパラメータの取得などを簡単に扱えるGoの外部ライブラリ 5選
パスパラメータを取得するのにセルフ実装は嫌だという場合は、net/httpの仕様を諦め、外部ライブラリを使用しよう。
見出しの通り、Go言語で人気のあるWebフレームワークおよびルーティングライブラリを5つ紹介する。
1. Gorilla Mux
Gorilla Muxは非常に人気があり、強力なURLルーターおよびディスパッチャー。パスパラメータ、正規表現ベースのルーティング、リバースルーティングなどの機能を提供している。
- URL: Gorilla Mux GitHub
2. Gin
Ginは高性能なHTTP Webフレームワーク。ルーティング、ミドルウェア、JSONの解析などが簡単に行える。Ginはスピード重視のアプリで使える。
- URL: Gin GitHub
3. Echo
Echoは高性能なミニマリストWebフレームワーク。容易なルーティング、中間処理、テンプレートレンダリングなどが特徴。Echoもまた、API開発において人気の選択肢の一つ。
- URL: Echo GitHub
4. Chi
Chiは小さく、急速に人気を集めているHTTPルーター。Goの標準net/http
に近い設計思想を持っており、中間層やルートグループ、URLパラメータの取得などをシンプルかつ効果的に行える。
- URL: Chi GitHub
5. Fiber
FiberはExpress.jsに触発されたWebフレームワークで、Node.jsの開発者に馴染み深いAPI設計を持っている。使いやすさとパフォーマンスのバランスが取れていることが特徴。
- URL: Fiber GitHub