, 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
Request
struct-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.NewReader
visszaadja a io.Reader
objektumot és ioutil.NopCloser
fü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.DefaultClient
egy ü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 Transport
mező 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 req
argumentum 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
Timeout
mező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.