å Lage tilpassede forespørsler

Så langt vi har lært hvordan å lage enkel HTTP-forespørsler, men vi gjorde ikke fokusere for mye på forespørsel tilpasning som å sette egendefinert forespørsel overskrifter eller gjøre PUT, PATCH og DELETE (og andre) HTTP-forespørsler.

http.Forespørsel struktur

http.Request sin struct konfigurerer be om å bli sendt., Get, Post og andre metoder eksponert av *http.Client faktisk konstruere http.Request objekt internt for å sende forespørsel.

Denne strukturen har flere felt for å konfigurere TLS-tilkobling, keep-alive-tilkobling, form data, innstillinger og andre innstillinger, men følgende felt er minimal konfigurasjon vi kan jobbe med.

💡 Du kan lese mer om Request sin struct fra her.,

*http.Request sin struct implementerer mange metoder for å endre request-objektet før den blir sendt. *Request.AddCookie metoden gir en informasjonskapsel på forespørsel objekt og *Request.SetBasicAuth angir grunnleggende autorisasjon overskriften på forespørsel. Du kan utforske disse metodene her.

Når vi konstruere en forespørsel objekt, må vi gjøre en avtale med denne forespørselen objekt manuelt. For at vi trenger å bruke *Client.Do metode. Siden Go gir http.DefaultClient, vi kan bruke det til å gjøre en forespørsel.,

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.,

be om kroppen som er lagret i Request.Body – feltet bør være et objekt som implementerer io.ReadCloser interface (en gruppe av io.Reader og io.Closer grensesnitt). strings.NewReader returnerer en io.Reader objekt og ioutil.NopCloser funksjon legger til Close() metode på io.Reader objekt.

Close metode som legges til av NopCloser funksjon gjør ingenting, det bare gir en nil feil., Forespørselen kroppen er stengt for I/O via denne Close() metode anrop når forespørselen er sendt. I den virkelige verden bruker tilfelle, bør du implementere Close metoden på riktig måte for å deaktivere I/O på forespørsel kroppen.

Vi har også initialisert Header – feltet med noen innledende avtale overskrifter. For å sende forespørsel, vi bruker DefaultClient.Do metode som returnerer nettverk respons og en non-nil feil dersom anmodningen ikke klarer.,

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

jeg er enig, sende en tilpasset forespørsel synes temmelig komplisert, men vi kan bruke http.NewRequest funksjonen til å konstruere *http.Request objekt fra noen enkle verdier som har følgende syntaks.

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

Denne funksjonen returnerer en *http.Request objekt og en non-nil feil i tilfelle noen argumentet verdier er ikke gyldig. Hvis method argumentet er tom, GET forespørsel er lagt til grunn., 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 implementere io.Closer grensesnitt, bør det ideelt sett implementere en gyldig Close metode som deaktiverer I/O, ellers Går du legger til en ikke-op i nærheten metode på den ved hjelp av ioutil.NopCloser funksjon.

http.Klient struktur

http.Client struktur skaper en HTTP-klient med noen konfigurasjon som kan sende HTTP-forespørsler. http.DefaultClient er en peker til en tom http.Client objekt som utsetter en standard HTTP-klient.,

var DefaultClient = &http.Client{}

Som vi har sett før, *http.Client implementerer Get, Post, PostForm, Head og Do metoder. La oss se hvordan. http.Client struktur typen ser ut som.

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 – feltet et objekt som implementerer RoundTrip metode. Dette objektet er ansvarlig for å utføre en enkel HTTP-forespørselen og returnere et svar., Hvis dette feltet verdien er nil, http.DefaultTransport type *http.Transport brukes. I de fleste tilfeller, denne standardverdien er godt nok for oss.

CheckRedirect – feltet er en funksjon som sjekker om omdirigering krevde et svar må følges. Hvis denne verdien er nil standard retningslinjer for maksimal 10 viderekoblinger som er brukt.

req argumentet er den nyeste forespørsel og via argumentet inneholder eldre forespørsler (i gamle første orden)., Hvis denne funksjonen returnerer en non-nil feil, omadressering forsøk er blokkert. Sjekk denne dokumentasjonen for å vite mer om hvordan responsen er tilbake, og feil typer.

Jar – feltet angir en mekanisme for å legge til informasjonskapsler på utgående HTTP-forespørsler og hurtigbufferen, informasjonskapsler fra innkommende svar. Denne cookie jar er konsultert for alle utgående og omdirigert forespørsel.

Hvis denne verdien er nil, cookies blir bare sendt hvis de er angitt på forespørsel (og som er kopiert til omdirigert forespørsler)., I tilfelle av en omdirigert forespørsel, cookie jar kan mutere verdiene av informasjonskapsler. Du kan bruke net/http/cookiejar pakken for å skape dine egne cookie jar.

Timeout – feltet angir frist før som svar bør leses. Hvis feltet verdi hvis 0 som betyr at det er ingen grense for tidsavbrudd gjennomført av HTTP-klient. Denne verdien angir tiden det tar før det endelige svaret er fullt lese, og som inneholder alle viderekoblinger og lesing av svar.,

⚠️ Siden standard verdi av Timeout – feltet er 0, kan det være farlig i noen scenarier der en skadelig tjeneste aldri sender et svar, utmattende din båndbredde, og forårsaker andre problemer. Derfor sørg for å legge til noen tidsavbrudd for hver forespørsel som stammer fra din maskin.

for Å sjekke om feil som returneres av *Client.Get (eller noen annen metode) er på grunn av tidsavbrudd, bør vi se err.Timeout() verdi., Hvis timeout oppstår mens du leser svaret kroppen, vil den returnere en feil.

La oss opprette en ny klient med en liten timeout verdi og sende en enkel HTTP GET forespørsel. Vi vil angi tidsavbrudd 100 milliseconds og siden det er en høy sannsynlighet for å be om timeout, vil vi også se etter et tidsavbrudd for feil.,

(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.,

Siden feil som returneres av Get metode (og andre metoder) er alltid av typen *url.Error skriver, vi trenger å trekke denne konkrete verdi fra err som er av typen error grensesnitt.

Når feil oppstår på grunn av et tidsavbrudd *Error.Temporary() metoden returnerer true. Og fra resultatet nedenfor kan vi se at de feil som returneres av Get metoden er faktisk på grunn av tidsavbrudd.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *