Gør tilpassede forespørgsler

Så langt, vi har lært, hvordan man laver simpel HTTP-anmodninger, men det gjorde vi ikke fokuserer for meget på anmodning tilpasning som indstilling af brugerdefinerede anmodning overskrifter eller gøre PUT PATCH og DELETE (og andre) HTTP-anmodninger.

http.Anmodningsstruktur

http.Request struct konfigurerer anmodningen, der skal sendes., Get Post og andre metoder, der udsættes af *http.Client faktisk konstruere http.Request objekt internt til at sende anmodningen.

denne struktur har flere felter til at konfigurere TLS-forbindelse, holde-alive-forbindelse, formulardata og andre indstillinger, men de følgende felter er minimal konfiguration, vi kan arbejde med.

You Du kan læse mere om Request struct herfra.,

*http.Request struct implementerer mange metoder til at ændre request-objektet, før det er sendt. Metoden *Request.AddCookie tilføjer en cookie på forespørgselsobjektet og*Request.SetBasicAuth indstiller den grundlæggende autorisationsoverskrift på anmodningen. Du kan udforske disse metoder herfra.

Når vi konstruerer et anmodningsobjekt, skal vi foretage en anmodning med dette anmodningsobjekt manuelt. Til det skal vi bruge *Client.Do metode. Da Go giver http.DefaultClient, kan vi bruge det til at fremsætte en anmodning.,

func (c *Client) Do(req *Request) (*Response, error)

(https://play.golang.org/p/1NIYkq4Tc7P)

In the above example, we are first creating a *url.URL object from a URL string by using url.Parse function. Since Request.URL field should be an object of type *url.URL, this step is necessary.,

anmodning krop, der er gemt i Request.Body felt skal være et objekt, der implementerer io.ReadCloser interface (en gruppe af io.Reader og io.Closer interfaces). strings.NewReader returnerer en io.Reader objekt og ioutil.NopCloser funktion tilføjer Close() metode på det io.Reader objektet.

Closemetode tilføjet af NopCloserfunktionen gør intet, det returnerer blot en nil fejl., Anmodningsorganet er lukket for I/o via dette Close() metodeopkald, når anmodningen sendes. I en virkelig brugssag skal du implementere Close metode korrekt for at deaktivere i / O på anmodningsorganet.

Vi har også initialiseret Header – feltet med nogle indledende anmodningsoverskrifter. For at sende anmodningen bruger vi DefaultClient.Do metode, der returnerer netværksresponsen og en non-nil fejl, hvis anmodningen mislykkes.,

🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}

jeg er enig i, at sende en anmodning tilpassede synes snarere at være kompliceret, men vi kan bruge http.NewRequest funktion at konstruere *http.Request objekt fra nogle enkle værdier, som har følgende syntaks.

func NewRequest(method, url string, body io.Reader) (*Request, error)

Denne funktion returnerer en *http.Request objekt og en non-nil fejl, i nogle tilfælde argument værdier er ikke gyldigt. Hvis method argumentet er tomt, antages GET anmodning., We can add headers to the returned *Request object.

(https://play.golang.org/p/USbFc0D0cW0)

The program above returns the same response as the earlier example., Selv om reqBody ikke gennemføre io.Closer interface, bør det ideelt gennemføre et gyldigt Close metode, der deaktiverer I/O, andet, Gå tilføjer en no-op tæt metode på det ved hjælp af ioutil.NopCloser funktion.

http.Klientstruktur

http.Client – strukturen opretter en HTTP-klient med en vis konfiguration, der kan sende HTTP-anmodninger. http.DefaultClient er en markør til et tomthttp.Client objekt, der udsætter en standard HTTP-klient.,

var DefaultClient = &http.Client{}

Som vi har set før, den *http.Client implementerer Get Post PostForm Head og Do metoder. Lad os se, hvordan http.Client strukturtype ser ud.

type Client struct {
// mechanism by which individual HTTP requests are made
Transport RoundTripper
// specifies the policy for handling redirects
CheckRedirect func(req *Request, via *Request) error// specifies the cookie jar
Jar CookieJar
// specifies a time limit for requests
Timeout time.Duration
}

Transport felt et objekt, der implementerer RoundTrip metode. Dette objekt er ansvarligt for at udføre en enkelt HTTP-anmodning og returnere et svar., Hvis denne feltværdi er nil, anvendes http.DefaultTransport af typen *http.Transport. I de fleste tilfælde er denne standardværdi god nok for os.

CheckRedirect – feltet er en funktion, der kontrollerer, om omdirigering krævet af et svar skal følges. Hvis denne værdi er nil, anvendes standardpolitikken for maksimum 10 omdirigeringer.

req argument er den nyeste anmodning ogvia argument indeholder de ældre anmodninger (i gammel første rækkefølge)., Hvis denne funktion returnerer en non-nil fejl, blokeres omdirigeringsforsøget. Tjek denne dokumentation for at vide mere om, hvordan svaret returneres og fejltyperne.

Jar – feltet specificerer en mekanisme til at tilføje cookies på udgående HTTP-anmodninger og cache-cookies fra de indgående svar. Denne cookie jar konsulteres for hver udgående og omdirigeret anmodning.

Hvis denne værdi er nil, sendes cookies kun, hvis de er angivet på anmodningen (og kopieres til omdirigerede anmodninger)., I tilfælde af en omdirigeret anmodning kan cookie jar mutere værdierne af cookien. Du kan bruge net/http/cookiejar pakken til at oprette din tilpassede cookie jar.

Timeout – feltet angiver den frist, inden for hvilken svaret skal læses. Hvis feltværdien hvis 0 hvilket betyder, at der ikke er nogen timeout implementeret af HTTP-klienten. Denne værdi angiver tiden, indtil det endelige svar er fuldt læst, som omfatter alle omdirigeringer og læsning af svaret.,

⚠️ Da standard værdi af Timeout feltet 0, det kan være farligt i nogle scenarier, hvor en ondsindet service sender aldrig et svar, udmattende din båndbredde, og forårsage andre problemer. Sørg derfor for at tilføje nogle timeout for hver anmodning, der stammer fra din maskine.

for at kontrollere, om fejlen returneret af *Client.Get(eller en anden metode) skyldes timeout, bør vi kontrollere err.Timeout() værdi., Hvis timeout opstår, mens du læser responskroppen, returnerer den en fejl.

lad os oprette en ny klient med en lille timeout-værdi og sende en simpel HTTP GET anmodning. Vi indstiller timeout-værdien 100 milliseconds, og da der er stor sandsynlighed for anmodning om timeout, vil vi også tjekke for en timeout-fejl.,

(https://play.golang.org/p/2qXkBOjqK8C)

In the example above, we have created an HTTP client with a timeout of 100ms. Since Get, Post and other methods are implemented by the pointer of http.Client type, the client is a pointer.,

Da fejl, der returneres af Get metode (og andre metoder) er altid af den type *url.Error type, vi har brug for at udtrække denne konkrete værdi fra err, som er af den type error brugerflade.

når fejlen opstår på grund af en timeout, returnerer *Error.Temporary()metoden true. Og fra resultatet nedenfor kan vi se, at fejlen returneret af Get – metoden faktisk er på grund af en timeout.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *