Как получить начальную временную метку http-запроса в golang? - PullRequest
0 голосов
/ 01 октября 2018

Я пишу программу golang, используя revel framework, в которой мне нужно проверить начальную временную метку http-запроса.

Я знаю, как это сделать в C #:

 HttpContextWrapper context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;

DateTime t2 = context.Timestamp.ToUniversalTime();

Не так много, как это сделать в Go.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Самое простое, что нужно сделать - это захватить текущее время в вашем обработчике.

type Handler struct {
}

func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  rs := time.Now().UTC()

  //TODO: Use the time.
}

Если вы хотите измерить время, затрачиваемое всем промежуточным ПО, предшествующим вашему обработчику, вы можете обновить контекст Go и поместитьваше промежуточное программное обеспечение в начале цепочки промежуточного программного обеспечения.

Вот пример того, как это промежуточное программное обеспечение может выглядеть:

package timemiddleware

import (
    "context"
    "net/http"
    "time"
)

// New returns new middleware which tracks the time that a request started.
func New(next http.Handler) http.Handler {
    return handler{
        next: next,
    }
}

type key int

const id = key(1)

type handler struct {
    next http.Handler
}

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    ctx := context.WithValue(r.Context(), id, time.Now().UTC())
    h.next.ServeHTTP(w, r.WithContext(ctx))
}

// GetTime returns time from the current request, where it has previously been added by the middleware.
func GetTime(r *http.Request) (t time.Time, ok bool) {
    v := r.Context().Value(id)
    t, ok = v.(time.Time)
    return
}

Вы могли бы использовать это в соответствии с этим примером:

основной пакет

import (
    "fmt"
    "net/http"
    "time"

    "github.com/xxxxx/timemiddleware"
)

func main() {
    next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        time.Sleep(time.Second * 5)
        w.Write([]byte("Hello"))
        if t, ok := timemiddleware.GetTime(r); ok {
            fmt.Println(t)
            fmt.Println(time.Now().UTC())
        }
    })

    h := timemiddleware.New(next)
    fmt.Println(http.ListenAndServe("0.0.0.0:8080", h))
}
0 голосов
/ 01 октября 2018

Класс HttpContext в .Net framework устанавливает временную метку при поступлении запроса на сервер .Вы также можете сохранить метку времени в первой строке функции-обработчика запроса.

...