ثبت درخواست
بیایید در همان راستا ادامه دهیم و میدلوری برای ثبت درخواستهای HTTP اضافه کنیم. به طور خاص، از لاگر ساختاریافته که قبلاً ایجاد کردیم برای ثبت آدرس IP کاربر و متد، URI و نسخه HTTP درخواست استفاده خواهیم کرد.
فایل middleware.go خود را باز کنید و یک متد logRequest() با استفاده از الگوی میدلور استاندارد ایجاد کنید، به این صورت:
package main ... func (app *application) logRequest(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var ( ip = r.RemoteAddr proto = r.Proto method = r.Method uri = r.URL.RequestURI() ) app.logger.Info("received request", "ip", ip, "proto", proto, "method", method, "uri", uri) next.ServeHTTP(w, r) }) }
توجه کنید که این بار میدلور را به عنوان یک متد روی application پیادهسازی میکنیم؟
این کاملاً معتبر است. متد میدلور ما همان امضای قبلی را دارد، اما چون یک متد روی application است، همچنین به وابستگیهای handler از جمله لاگر ساختاریافته دسترسی دارد.
حالا بیایید فایل routes.go خود را بهروزرسانی کنیم تا میدلور logRequest ابتدا و برای همه درخواستها اجرا شود، به طوری که جریان کنترل (خواندن از چپ به راست) به این صورت باشد:
logRequest ↔ commonHeaders ↔ servemux ↔ application handler
package main import "net/http" func (app *application) routes() http.Handler { mux := http.NewServeMux() fileServer := http.FileServer(http.Dir("./ui/static/")) mux.Handle("GET /static/", http.StripPrefix("/static", fileServer)) mux.HandleFunc("GET /{$}", app.home) mux.HandleFunc("GET /snippet/view/{id}", app.snippetView) mux.HandleFunc("GET /snippet/create", app.snippetCreate) mux.HandleFunc("POST /snippet/create", app.snippetCreatePost) // Wrap the existing chain with the logRequest middleware. return app.logRequest(commonHeaders(mux)) }
خوب… بیایید آن را امتحان کنیم!
برنامه خود را مجدداً راهاندازی کنید، گشتزنی کنید و سپس پنجره ترمینال خود را بررسی کنید. باید خروجی لاگ را ببینید که کمی شبیه این است:
$ go run ./cmd/web time=2024-03-18T11:29:23.000+00:00 level=INFO msg="starting server" addr=:4000 time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56536 proto=HTTP/1.1 method=GET uri=/ time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56536 proto=HTTP/1.1 method=GET uri=/static/css/main.css time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56546 proto=HTTP/1.1 method=GET uri=/static/js/main.js time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56536 proto=HTTP/1.1 method=GET uri=/static/img/logo.png time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56536 proto=HTTP/1.1 method=GET uri=/static/img/favicon.ico time=2024-03-18T11:29:23.000+00:00 level=INFO msg="received request" ip=127.0.0.1:56536 proto=HTTP/1.1 method=GET uri="/snippet/view/2"