Making räätälöityjä pyyntöjä

tähän mennessä olemme oppineet, miten tehdä yksinkertainen HTTP-pyyntöjä, mutta emme keskittyä liikaa pyytää muokkausta, kuten asettamalla custom pyynnöstä otsikot tai tehdä PUT, PATCH ja DELETE (ja muut) HTTP-pyyntöjä.

http.Pyyntö rakenne

http.Request struct määrittää pyyntö lähetetään., Get, Post ja muita menetelmiä altistuvat *http.Client oikeastaan rakentaa http.Request objekti sisäisesti lähettää pyynnön.

tässä rakenteessa on useita kenttiä TLS-yhteyden, keep-alive-yhteyden, lomaketietojen ja muiden asetusten määrittämiseen, mutta seuraavat kentät ovat minimaalisia asetuksia, joiden kanssa voimme työskennellä.

💡 Voit lukea lisää Request struct täältä.,

*http.Request struct toteuttaa monia menetelmiä muokata pyynnön kohde, ennen kuin se on lähetetty. *Request.AddCookie menetelmä lisää evästeen pyynnön kohde ja *Request.SetBasicAuth asettaa perus authorization-header pyynnöstä. Voit tutustua näihin menetelmiin täältä.

kun rakennamme pyyntöobjektin, meidän on tehtävä pyyntö tämän pyyntöobjektin kanssa manuaalisesti. Sitä varten on käytettävä *Client.Do – menetelmää. Koska Go tarjoaa http.DefaultClient, voimme käyttää sitä tehdä pyynnön.,

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

– pyynnön tekstiosa tallennetaan Request.Body kentän pitäisi olla objekti, joka toteuttaa io.ReadCloser interface (ryhmä io.Reader ja io.Closer interfaces). strings.NewReader palauttaa io.Reader objekti ja ioutil.NopCloser toiminto lisää Close() tapa io.Reader objekti.

Close menetelmä lisätty NopCloser – toiminto ei tee mitään, se vain palauttaa nil virhe., Pyynnön elin on suljettu I/O tätä kautta Close() menetelmä puhelu, kun pyyntö lähetetään. Todellinen-maailma käyttää tapauksessa, sinun pitäisi toteuttaa Close menetelmä oikein poistaa I/O-pyynnön tekstiosa.

olemme alustaneet myös Header kentän, jossa on joitakin alkuperäisen pyynnön otsikoita. Kun haluat lähettää pyynnön, olemme käyttäen DefaultClient.Do metodi, joka palauttaa verkon vaste ja a non-nil virhe, jos pyyntö epäonnistuu.,

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

olen samaa mieltä, lähettää räätälöityjä pyynnöstä näyttää melko monimutkainen mutta voimme käyttää http.NewRequest toiminto rakentaa *http.Request objektin joitakin yksinkertaisia arvoja, jotka on seuraava syntaksi.

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

Tämä funktio palauttaa *http.Request objekti ja non-nil virhe siinä tapauksessa, että jonkin argumentin arvot eivät ole kelvollisia. Jos method argumentti on tyhjä, GET pyyntö on oletettu., 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., Vaikka reqBody ei toteuta io.Closer käyttöliittymä, se tulisi mieluiten toteuttaa voimassa Close menetelmä, joka poistaa käytöstä I/O, muuta, siitä lisää o-op lähellä menetelmää käyttäen ioutil.NopCloser toiminto.

http.Asiakas rakenne

http.Client rakenne luo HTTP-asiakkaan kanssa joitakin kokoonpano, joka voi lähettää HTTP-pyyntöjä. http.DefaultClient on osoitin tyhjään http.Client objekti, joka altistaa oletuksena HTTP-asiakas.,

var DefaultClient = &http.Client{}

Kuten olemme nähneet ennen, *http.Client toteuttaa Get, Post, PostForm, Head ja Do menetelmiä. Katsotaan, miltä http.Client rakennetyyppi näyttää.

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 kenttä esine, joka toteuttaa RoundTrip menetelmä. Tämä objekti on vastuussa yhden HTTP-pyynnön suorittamisesta ja vastauksen palauttamisesta., Jos tämän kentän arvo on nil, http.DefaultTransport tyyppi *http.Transport käytetään. Useimmissa tapauksissa, tämä oletusarvo on tarpeeksi hyvä meille.

CheckRedirect kenttä on funktio, joka tarkistaa, jos uudelleenohjaus vaati vastausta on noudatettava. Jos tämä arvo on nil, default politiikan enintään 10 uudelleenohjauksia käytetään.

req argumentti on uusin pyynnön ja via argumentti sisältää vanhempi pyytää (vanhassa ensimmäinen tilaus)., Jos funktio palauttaa non-nil virheen, uudelleenohjausyritys estyy. Tarkista tämä dokumentaatio tietää enemmän siitä, miten vastaus palautetaan ja virhetyypit.

Jar – kenttä määrittää, mekanismi, lisätä evästeitä lähtevän HTTP-pyyntöjen ja välimuistin evästeet saapuvan vastauksia. Tätä evästepurkkia kuullaan jokaisesta lähtevästä ja uudelleenohjatusta pyynnöstä.

Jos tämä arvo on nil evästeet lähetetään vain, jos ne on määritetty pyynnössä (ja kopioidaan ohjataan pyynnöt)., Kun kyseessä on uudelleenohjattu pyyntö, evästepurkki voi mutatoida evästeen arvot. Voit käyttää net/http/cookiejar – pakettia luodaksesi räätälöidyn evästepurkkisi.

Timeout – kenttä määrittää aikarajan, jota ennen vastaus tulisi lukea. Jos kentän arvo if 0 eli HTTP-asiakkaan toteuttamaa aikalisää ei ole. Tämä arvo ilmaisee ajan, jonka kuluessa lopullinen vastaus on täysin luettu, joka sisältää kaikki vasteen uudelleenohjaukset ja lukemisen.,

⚠️ Koska oletusarvo Timeout kenttä 0, se voi olla vaarallista joissakin tilanteissa, jossa ilkeä palvelu ei koskaan lähettää vastauksen, uuvuttavaa kaistanleveys, ja aiheuttaa muita ongelmia. Näin ollen varmista lisätä jonkin verran aikalisä kunkin pyynnön, joka on peräisin koneen.

jos Haluat tarkistaa, onko virhe palautetaan *Client.Get (tai muulla menetelmällä) on aikakatkaisun vuoksi, meidän pitäisi tarkistaa err.Timeout() arvo., Jos aikalisä tapahtuu vastekehoa lukiessa, se palauttaa virheen.

katsotaanpa luoda uuden asiakkaan kanssa pieni timeout-arvo ja lähettää yksinkertainen HTTP – GET pyyntö. Meidän tulee asettaa aikakatkaisun arvo 100 milliseconds ja koska on olemassa suuri todennäköisyys pyynnön aikakatkaisu, voimme myös tarkistaa aikakatkaisu virhe.,

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

Koska virhe palautetaan Get menetelmä (ja muut menetelmät) on aina tyyppi *url.Error tyyppi, meidän täytyy poimia tämä konkreettinen arvo err joka on tyyppiä error käyttöliittymä.

Kun virhe ilmenee, koska aikakatkaisu *Error.Temporary() metodi palauttaa true. Ja alla olevasta tuloksesta voi nähdä, että Get – menetelmällä palautettu virhe johtuu todellakin aikalisästä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *