å 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)
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.
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 er0
, 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.,
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.