Vytváření vlastní žádosti

zatím jsme se naučili, jak udělat jednoduchý HTTP požadavky, ale neměli jsme se soustředit příliš na vyžádání úprav, jako je nastavení vlastní žádost mailů nebo dělat PUT PATCH DELETE (a dalších) HTTP požadavků.

http.Struktura požadavku

http.Request struct konfiguruje požadavek, který má být odeslán., Get Post a další metody vystaven v *http.Client vytvořit http.Request objekt interně odeslat žádost.

Tato struktura má několik polí nakonfigurovat TLS připojení keep-alive spojení, data formuláře, a další nastavení, ale tato pole jsou minimální konfigurace můžeme pracovat.

💡 můžete si přečíst více o Request struct odtud.,

*http.Request struct implementuje mnoho metod pro úpravu objektu požadavku před odesláním. Metoda *Request.AddCookie přidá soubor cookie na objekt požadavku a *Request.SetBasicAuth nastaví základní záhlaví oprávnění na vyžádání. Tyto metody můžete prozkoumat zde.

jakmile vytvoříme objekt požadavku, musíme ručně provést požadavek s tímto objektem požadavku. K tomu musíme použít metodu *Client.Do. Protože Go poskytuje http.DefaultClient, můžeme jej použít k podání žádosti.,

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

žádost tělo uložené v Request.Body pole by měl být objekt, který implementuje io.ReadCloser rozhraní (skupina io.Reader io.Closer rozhraní). strings.NewReader vrací io.Reader objekt a ioutil.NopCloser funkce přidá Close() metoda io.Reader objekt.

Close metoda přidal NopCloser funkce nedělá nic, je to prostě vrátí nil chyba., Tělo požadavku je uzavřeno pro I / O prostřednictvím tohoto volání metody Close() při odeslání požadavku. V případě použití v reálném světě byste měli správně implementovat metodu Close, abyste deaktivovali I / O na těle požadavku.

také jsme inicializovali pole Header s některými počátečními záhlaví požadavků. Pro odeslání požadavku používáme metodu DefaultClient.Do, která vrací odpověď sítě a chybu non-nil, pokud požadavek selže.,

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

souhlasím s tím, posílat vlastní žádost se zdá být poměrně složité, ale můžeme použít http.NewRequest funkce construct *http.Request objekt z některé jednoduché hodnoty, které má následující syntaxi.

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

Tato funkce vrací *http.Request objekt a non-nil chyba v případě, že je nějaký argument hodnoty nejsou platné. Pokud je parametrmethod prázdný, předpokládá se požadavekGET., 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., I když reqBody neimplementuje io.Closer rozhraní, to by měl v ideálním případě provádět platnou Close metoda, která zakáže I/O, ostatní, Jít přidává ne-op close metoda na to pomocí ioutil.NopCloser funkce.

http.Struktura klienta

strukturahttp.Client vytváří HTTP klienta s nějakou konfigurací, která může odesílat HTTP požadavky. http.DefaultClient je ukazatel na prázdný objekt http.Client, který vystavuje výchozí HTTP klient.,

var DefaultClient = &http.Client{}

Jak jsme viděli dříve, *http.Client nářadí Get Post PostForm, Head Do metody. Podívejme se, jak vypadáhttp.Client typ struktury.

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 pole objekt, který implementuje RoundTrip metoda. Tento objekt je zodpovědný za provedení jediného požadavku HTTP a vrácení odpovědi., Pokud je tato hodnota pole nil, http.DefaultTransport typu *http.Transport. Ve většině případů je tato výchozí hodnota pro nás dost dobrá.

poleCheckRedirect je funkce, která kontroluje, zda je třeba sledovat přesměrování požadované odpovědí. Pokud tato hodnota je nil, výchozí zásada maximálního 10 přesměrování se používá.

req argument je nejnovější požadavek a via argument obsahuje starší, požadavky (ve starém prvního řádu)., Pokud tato funkce vrátí chybu non-nil, pokus o přesměrování je zablokován. Zkontrolujte tuto dokumentaci a zjistěte více o tom, jak je odpověď vrácena a typy chyb.

poleJar určuje mechanismus přidávání souborů cookie na odchozí požadavky HTTP a soubory cookie mezipaměti z příchozích odpovědí. Tato cookie jar je konzultována pro každou odchozí a přesměrovanou žádost.

Pokud je tato hodnota nil, soubory cookie jsou odesílány pouze v případě, že jsou zadány na vyžádání (a zkopírovány na přesměrované požadavky)., V případě přesměrovaného požadavku může cookie jar mutovat hodnoty cookie. Můžete použítnet/http/cookiejar balíček k vytvoření přizpůsobené cookie jar.

poleTimeout určuje časový limit, před kterým by měla být odpověď přečtena. Pokud hodnota pole if 0 což znamená, že HTTP klient neprovádí žádný časový limit. Tato hodnota udává čas do úplného přečtení konečné odpovědi, která zahrnuje všechna přesměrování a čtení odpovědi.,

⚠️ Od výchozí hodnoty Timeout pole 0, to by mohlo být nebezpečné v některých situacích, kde je nebezpečné služby nikdy odešle odpověď, vyčerpávající vaši šířku pásma, a způsobit další problémy. Proto nezapomeňte přidat nějaký časový limit pro každou žádost, která pochází z vašeho počítače.

zjistit, jestli chyba vrácený *Client.Get (nebo jiné metody) je vzhledem k časový limit, bychom měli zkontrolovat, err.Timeout() hodnota., Pokud dojde k časového limitu při čtení těla odezvy, vrátí se chyba.

vytvoříme nového klienta s malou hodnotou časového limitu a odešleme jednoduchý HTTP GET požadavek. Nastavíme hodnotu časového limitu 100 milliseconds a protože existuje vysoká pravděpodobnost časového limitu požadavku, zkontrolujeme také chybu časového limitu.,

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

Od té doby vrácena chyba Get metoda (a jiné metody) je vždy typu *url.Error typu, musíme extrahovat konkrétní hodnotu z err, který je typu error rozhraní.

když dojde k chybě v důsledku časového limitu, metoda*Error.Temporary() vrátítrue. A z výsledku níže, můžeme vidět, že chyba se vrátil do Get metoda je skutečně z důvodu vypršení časového limitu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *