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