, Hogy egyedi kéréseket
eddig megtanultuk, hogyan kell az egyszerű HTTP-kérés, de mi nem összpontosít túl sok kérés, testreszabás, mint a beállítás egyéni kérés fejlécek, vagy hogy a PUT, PATCH vagy DELETE (másokkal együtt) a HTTP kéréseket.
http.Request structure
the http.Request struct configures the request to be sent., AGet,Post és a*http.Client valójábanhttp.Request objektum belsőleg a kérés elküldéséhez.
ennek a struktúrának több mezője van a TLS kapcsolat, a keep-alive kapcsolat, az űrlapadatok és egyéb beállítások konfigurálásához, de a következő mezők minimális konfigurációval rendelkeznek, amellyel dolgozhatunk.
💡 itt olvashat bővebben a
Requeststruct-ról.,
a *http.Request a Struct számos módszert alkalmaz a kérés objektum módosítására az elküldés előtt. A*Request.AddCookie metódus cookie-t ad hozzá a kérés objektumhoz, a*Request.SetBasicAuth beállítja az alapvető engedély fejlécét a kérésre. Ezeket a módszereket itt lehet felfedezni.
miután létrehoztunk egy kérésobjektumot, manuálisan kell kérnünk ezt a kérésobjektumot. Ehhez a *Client.Do módszert kell használnunk. Mivel a Go http.DefaultClient, ezt felhasználhatjuk kérés benyújtására.,
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.,
aRequest.Body mezőben tárolt kéréstestnek olyan objektumnak kell lennie, amely aio.ReadCloser interfészt valósítja meg (aio.Reader ésio.Closer interfészek csoportja). A strings.NewReadervisszaadja a io.Readerobjektumot és ioutil.NopCloserfüggvény Close()módszert a io.Reader objektumra.
The Close method added by the NopCloser function does nothing, it simply returns a nil error., Az I / O kérést a Close() metódushívás zárja le a kérés elküldésekor. Egy valós használati esetben a Close módszert helyesen kell végrehajtania az I/O letiltásához a kérési testen.
inicializáltuk a Header mezőt néhány kezdeti kérés fejléccel. A kérés elküldéséhez a DefaultClient.Do metódust használjuk, amely a hálózati választ és a non-nil hibát adja vissza, ha a kérés sikertelen.,
🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}
egyetértek azzal, hogy egy testreszabott Kérés küldése meglehetősen bonyolultnak tűnik, de ahttp.NewRequest függvényt használhatjuk*http.Request objektum néhány egyszerű értékből, amely a következő szintaxist tartalmazza.
func NewRequest(method, url string, body io.Reader) (*Request, error)
Ez a függvény a *http.Request objektumot és a non-nil hibát ad vissza, ha néhány argumentum érték nem érvényes. Hamethod argumentum üres,GET kérés feltételezhető., We can add headers to the returned *Request object.

The program above returns the same response as the earlier example., Annak ellenére, hogy areqBody nem hajtja végre aio.Closer interfészt, ideálisan végre kell hajtania egy érvényesClose módszert, amely letiltja az I/O-t, különben a Go hozzáad egy no-op close módszert aioutil.NopCloser funkcióval.
http.Kliens struktúra
ahttp.Client struktúra létrehoz egy HTTP kliens néhány konfiguráció, amely küldhet HTTP kéréseket. A http.DefaultClientegy üres http.Client objektumra mutató mutató, amely egy alapértelmezett HTTP klienst jelenít meg.,
var DefaultClient = &http.Client{}
ahogy korábban láttuk, a *http.Client Get, Post, PostForm, Head és Do módszerek. Lássuk, hogyan néz ki a http.Client szerkezet típusa.
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
}
The Transportmező a RoundTrip metódust megvalósító objektum. Ez az objektum felelős egyetlen HTTP kérés végrehajtásáért, majd válasz visszaadásáért., Ha ez a mező értéke nil, http.DefaultTransport*http.Transport. A legtöbb esetben ez az alapértelmezett érték elég jó számunkra.
a CheckRedirect mező egy olyan funkció, amely ellenőrzi, hogy a Válasz által igényelt átirányítást be kell-e tartani. Ha ez az érték nil, akkor a maximum 10 átirányítások alapértelmezett házirendjét használjuk.
a reqargumentum a legújabb kérés, és via argumentum tartalmazza a régebbi kéréseket (régi első sorrendben)., Ha ez a függvény non-nil hibát ad vissza, az átirányítási Kísérlet blokkolva van. Ellenőrizze ezt a dokumentációt, hogy többet tudjon meg a válasz visszaküldéséről és a hibatípusokról.
a Jar mező egy olyan mechanizmust határoz meg, amellyel a kimenő HTTP kéréseknél cookie-kat lehet hozzáadni, a bejövő válaszokból pedig gyorsítótárat. Ez a cookie jar konzultál minden kimenő és átirányított kérést.
Ha ez az értéknil, akkor a cookie-k csak akkor kerülnek elküldésre, ha azokat a kérelemben megadták (és átirányított kérésekre másolták)., Átirányított kérés esetén a cookie jar mutálhatja a cookie értékeit. Használhatja anet/http/cookiejar csomagot a testreszabott cookie-jar létrehozásához.
a Timeout mező meghatározza azt a határidőt, amely előtt a választ el kell olvasni. Ha a mező értéke, ha 0 ami azt jelenti, nincs időtúllépés által végrehajtott HTTP kliens. Ez az érték azt az időt jelzi, amíg a végső válasz teljesen olvasható, amely magában foglalja az összes átirányítás és olvasás a válasz.,
️ ️ mivel az alapértelmezett érték
Timeoutmező0, veszélyes lehet bizonyos esetekben, amikor egy rosszindulatú szolgáltatás soha nem küld választ, kimeríti a sávszélességet, és más problémákat okoz. Ezért győződjön meg róla, hogy adjunk néhány timeout minden kérést, hogy származik a gép.
annak ellenőrzésére, hogy a *Client.Get (vagy bármely más módszer) által visszaküldött hiba időtúllépés miatt van-e, ellenőriznünk kell a err.Timeout() értéket., Ha az időtúllépés a választestet olvasva történik, akkor hiba lép fel.
hozzunk létre egy új klienst egy kis időtúllépési értékkel, majd küldünk egy egyszerű HTTP GET kérést. A 100 milliseconds időtúllépési értéket állítjuk be, és mivel nagy a valószínűsége a kérési időtúllépésnek, ellenőrizzük az időtúllépési hibát is.,

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.,
mivel a Get metódus (és más módszerek) által visszaadott hiba mindig a *url.Error típus típusba tartozik, ezt a konkrét értéket a err típusból kell kivonnunk, amely error div > interfész.
Ha a hiba időtúllépés miatt jelentkezik, a*Error.Temporary() metódustrueértéket ad vissza. Az alábbi eredményből láthatjuk, hogy a Get módszer által visszaküldött hiba valóban időtúllépés miatt van.