Obecnie piszę niektóre oprogramowanie w Go, które współdziała z interfejsem API REST. Punkt końcowy interfejsu REST API, który próbuję wysłać, zwraca przekierowanie HTTP 302 wraz z nagłówkiem lokalizacji HTTP, wskazując na identyfikator URI zasobu.Jak można sprawić, aby klient HTTP NIE wykonał automatycznych przekierowań?
Próbuję użyć mojego skryptu Go, aby pobrać nagłówek Location HTTP do późniejszego przetworzenia.
Oto co mam aktualnie robi, aby osiągnąć tę funkcjonalność obecnie:
package main
import (
"errors"
"fmt"
"io/ioutil"
"net/http"
)
var BASE_URL = "https://api.stormpath.com/v1"
var STORMPATH_API_KEY_ID = "xxx"
var STORMPATH_API_KEY_SECRET = "xxx"
func noRedirect(req *http.Request, via []*http.Request) error {
return errors.New("Don't redirect!")
}
func main() {
client := &http.Client{
CheckRedirect: noRedirect
}
req, err := http.NewRequest("GET", BASE_URL+"/tenants/current", nil)
req.SetBasicAuth(STORMPATH_API_KEY_ID, STORMPATH_API_KEY_SECRET)
resp, err := client.Do(req)
// If we get here, it means one of two things: either this http request
// actually failed, or we got an http redirect response, and should process it.
if err != nil {
if resp.StatusCode == 302 {
fmt.Println("got redirect")
} else {
panic("HTTP request failed.")
}
}
defer resp.Body.Close()
}
to czuje się trochę hack do mnie. Przesłaniając funkcję http.Client
CheckRedirect
, jestem zasadniczo zmuszony do traktowania przekierowań HTTP, takich jak błędy (których nie są).
Widziałem kilka innych miejsc sugerujących użycie transportu HTTP zamiast klienta HTTP - ale nie jestem pewien, jak to zrobić, ponieważ potrzebuję klienta HTTP, ponieważ potrzebuję używać HTTP Basic Auth do komunikować się z tym interfejsem API REST.
Czy ktokolwiek może mi powiedzieć, w jaki sposób wysyłać żądania HTTP z podstawowym uwierzytelnianiem - bez wykonywania przekierowań - który nie wiąże się z wyrzucaniem błędów i obsługą błędów?
Dziękuję.
Patrząc na [źródło] (http://golang.org/src/pkg/net/http/client.go) nie wygląda na to. Nagłówek 'Location' jest wyciągnięty * po * wywołaniu' CheckRedirect' i nie masz dostępu do odpowiedzi tymczasowej. –
Wierzę, że masz rację: @DmitriGoldring - doprowadzając mnie do szału. MUSI być sposobem, aby to osiągnąć - nie wyobrażam sobie, że nie jest to dobry sposób>< – rdegges