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

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

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.

(https://play.golang.org/p/USbFc0D0cW0)

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

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

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük