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