Golang net/httpバッグを簡単に分析します。
1497 ワード
net/httpはHTTP要求と処理に関するコードを網羅しました。パッケージには、大量のタイプ、関数が定義されていますが、最も重要で基本的な概念は2つだけです。ServeMuxとHandler。
ServeMuxはHTTP要求マルチプレクサ(すなわちルータ、HTTP request router)であり、要求ルーティングテーブルが記録されている。到来する要求ごとに、要求経路とルーティングテーブルに定義されたURLパスを比較し、要求を処理するために指定されたhandlerを呼び出します。
Handlerのタスクは、レスポンスメッセージを返し、headerとbodyをメッセージに書き込みます。どのオブジェクトもhttp.Handlerインターフェースのインターフェース方法ServeHTTPを実現すれば、handlerになります。ServeHTTPのメソッド署名は、ServeHTTPです。
まず以下のコードを通して、それらの機能を迅速に理解します。は、まず、http.NewServeMux方法を用いてHTTP要求ルータを生成する。この方法の内部論理は実はreturn new(ServeMux)である。 その後、カスタムhandlerを作成しました。機能はHello worldに戻ります。テキスト; は、次に、新たに作成されたServeMuxオブジェクトに、mux.Handle関数を介してハンドルを登録する。このようにhandlerはURLパス/fooと関連しています。 最後に、serverを作成し、3000ポートで要求を傍受します。ここでListenAndServeの方法署名はListenAndServeであり、ServeMuxがServeHTTPインターフェース方法を実現したからです。 この二つの概念をマスターしました。基本的に他の概念はServer、Cientタイプ、HandleFun関数はhanderなどとしてよく分かりました。また、HTTPに関する概念がよくわからない場合、例えばTCP keep-alive、proxy、redirect、cookie、TLSなど、「HTTP:The Definitive Guide」を読んで知識を補充することを提案します。
参考文献:A Recap of Request Handling in Go
ServeMuxはHTTP要求マルチプレクサ(すなわちルータ、HTTP request router)であり、要求ルーティングテーブルが記録されている。到来する要求ごとに、要求経路とルーティングテーブルに定義されたURLパスを比較し、要求を処理するために指定されたhandlerを呼び出します。
Handlerのタスクは、レスポンスメッセージを返し、headerとbodyをメッセージに書き込みます。どのオブジェクトもhttp.Handlerインターフェースのインターフェース方法ServeHTTPを実現すれば、handlerになります。ServeHTTPのメソッド署名は、ServeHTTPです。
まず以下のコードを通して、それらの機能を迅速に理解します。
package main
import (
"io"
"log"
"net/http"
)
type myHandler struct{}
func (h *myHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
io.WriteString(w, "Hello world!
")
}
func main() {
mux := http.NewServeMux()
h := new(myHandler)
mux.Handle("/foo", h)
log.Println("Listening...")
http.ListenAndServe(":3000", mux)
}
コードの分解は以下の通りです。参考文献:A Recap of Request Handling in Go