Let's Go میدل‌ور › ثبت درخواست
قبلی · فهرست · بعدی
فصل ۶.۳.

ثبت درخواست

بیایید در همان راستا ادامه دهیم و میدل‌وری برای ثبت درخواست‌های HTTP اضافه کنیم. به طور خاص، از لاگر ساختاریافته که قبلاً ایجاد کردیم برای ثبت آدرس IP کاربر و متد، URI و نسخه HTTP درخواست استفاده خواهیم کرد.

فایل middleware.go خود را باز کنید و یک متد logRequest() با استفاده از الگوی میدل‌ور استاندارد ایجاد کنید، به این صورت:

File: cmd/web/middleware.go
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
File: cmd/web/routes.go
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"