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です。
まず以下のコードを通して、それらの機能を迅速に理解します。
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) }
コードの分解は以下の通りです。
  • は、まず、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