2014-07-04 11 views
7

Chciałbym zalogować 301s vs 302, ale nie widzę sposobu, aby odczytać kod stanu odpowiedzi w Client.Do, Get, doFollowingRedirects, CheckRedirect. Czy będę musiał sam przeprowadzić przekierowanie, aby to osiągnąć?Jak uzyskać kody przekierowań http w Golang

+0

Czy próbowałeś Response.StatusCode? – rvignacio

+1

@rvignacio Golang http.Client wykonuje przekierowania automatycznie, więc wszystko co dałoby mi to końcowy kod statusu 200. –

Odpowiedz

8

Typ http.Client pozwala określić niestandardowy transport, który powinien umożliwić wykonanie tego, co chcemy. Coś jak poniżej powinno:

type LogRedirects struct { 
    Transport http.RoundTripper 
} 

func (l LogRedirects) RoundTrip(req *http.Request) (resp *http.Response, err error) { 
    t := l.Transport 
    if t == nil { 
     t = http.DefaultTransport 
    } 
    resp, err = t.RoundTrip(req) 
    if err != nil { 
     return 
    } 
    switch resp.StatusCode { 
    case http.StatusMovedPermanently, http.StatusFound, http.StatusSeeOther, http.StatusTemporaryRedirect: 
     log.Println("Request for", req.URL, "redirected with status", resp.StatusCode) 
    } 
    return 
} 

(można to trochę uprościć, jeśli obsługuje się tylko łańcuchowe do transportu domyślnego).

Następnie można utworzyć klienta przy użyciu tego transportu, a wszelkie przekierowania powinny być rejestrowane:

client := &http.Client{Transport: LogRedirects{}} 

Oto pełny przykład można eksperymentować z: http://play.golang.org/p/8uf8Cn31HC

+0

Dla bardziej pouczających komunikatów, możesz również użyć ['http.StatusText()'] (https://golang.org/pkg/net/http/#StatusText), aby dołączyć przyjazną dla człowieka nazwę kodu statusu. –

Powiązane problemy