de a Face cereri personalizate
până acum am învățat cum să facă simple cereri HTTP, dar nu se concentreze prea mult pe cererea de personalizare, cum ar fi stabilirea anteturile cerere personalizate sau de a face PUT
, PATCH
și DELETE
(și altele) cereri HTTP.
http.Structura cererii
http.Request
struct configurează cererea de trimis., Get
, Post
și alte metode expuse de către *http.Client
de fapt să construim http.Request
obiect intern pentru a trimite cererea.această structură are mai multe câmpuri pentru a configura conexiunea TLS, conexiunea keep-alive, datele formularului și alte setări, dar următoarele câmpuri sunt configurație minimă cu care putem lucra.
💡 puteți citi mai multe despre
Request
struct de aici.,
*http.Request
struct pune în aplicare mai multe metode de a modifica cererea de obiect înainte de a fi trimis. Metoda *Request.AddCookie
adaugă un cookie la obiectul de solicitare și *Request.SetBasicAuth
stabilește antetul de autorizare de bază la cerere. Puteți explora aceste metode de aici.odată ce vom construi un obiect cerere, avem nevoie pentru a face o cerere cu acest obiect cerere manual. Pentru aceasta, trebuie să folosim metoda *Client.Do
. Deoarece Go oferă http.DefaultClient
, putem folosi asta pentru a face o solicitare.,
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.,
cererea corpul stocate în Request.Body
domeniu ar trebui să fie un obiect care implementează io.ReadCloser
interface (un grup de io.Reader
și io.Closer
interfaces). strings.NewReader
returnează un io.Reader
obiect și ioutil.NopCloser
funcția adaugă Close()
metoda pe io.Reader
obiect.
Close
metoda adăugate de către NopCloser
funcția nu face nimic, pur și simplu întoarce un nil
eroare., Organismul de solicitare este Închis Pentru I/o prin această metodă Close()
apel atunci când cererea este trimisă. Într-un caz de utilizare din lumea reală, ar trebui să implementați metoda Close
corect pentru a dezactiva I/o pe corpul de solicitare.
am inițializat, de asemenea, câmpul Header
cu câteva anteturi de solicitare inițială. Pentru a trimite solicitarea, folosim DefaultClient.Do
metoda care returnează răspunsul în rețea și o eroare non-nil
dacă solicitarea eșuează.,
🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}
sunt de acord, trimite o cerere personalizata pare destul de complicat, dar putem folosi http.NewRequest
funcția de a construi *http.Request
obiect de unele valori simple care are următoarea sintaxă.
func NewRequest(method, url string, body io.Reader) (*Request, error)
Această funcție returnează un *http.Request
obiect și un non-nil
eroare în caz un argument valorile nu sunt valabile. Dacămethod
argumentul este gol, GET
se presupune solicitarea., We can add headers to the returned *Request
object.
The program above returns the same response as the earlier example., Chiar dacă reqBody
nu pune în aplicare io.Closer
interfață, aceasta ar trebui să pună în aplicare în mod ideal valabil Close
metoda care dezactivează I/O, altfel, Merge adaugă un no-op aproape metodă pe ea folosind ioutil.NopCloser
function.
http.Structura clientului
http.Client
structura creează un client HTTP cu o anumită configurație care poate trimite cereri HTTP. http.DefaultClient
este un pointer la un gol http.Client
obiect care expune un default HTTP client.,
var DefaultClient = &http.Client{}
după Cum am văzut mai înainte, *http.Client
implementează Get
, Post
, PostForm
, Head
și Do
metode. Să vedem cum arată http.Client
tipul de structură.
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
teren un obiect care implementează RoundTrip
metoda. Acest obiect este responsabil să execute o singură solicitare HTTP și să returneze un răspuns., Dacă valoarea câmpului este nil
, http.DefaultTransport
de tip *http.Transport
este folosit. În cele mai multe cazuri, această valoare implicită este suficient de bună pentru noi.
câmpul CheckRedirect
este o funcție care verifică dacă redirecționarea cerută de un răspuns trebuie urmată. Dacă această valoare este nil
, politica implicită de maxim 10
redirecționează este folosit.
argumentulreq
este cea mai nouă cerere și via
argumentul conține cererile mai vechi (în prima ordine veche)., Dacă această funcție returnează o eroare non-nil
, încercarea de redirecționare este blocată. Verificați această documentație pentru a afla mai multe despre modul în care răspunsul este returnat și tipurile de erori.
câmpul Jar
specifică un mecanism pentru a adăuga cookie-uri la cererile HTTP de ieșire și cookie-urile cache din răspunsurile primite. Acest borcan cookie este consultat pentru fiecare solicitare de ieșire și redirecționare.
dacă această valoare este nil
, cookie-urile sunt trimise numai dacă sunt specificate în cerere (și copiate în solicitări redirecționate)., În cazul unei solicitări redirecționate, cookie jar poate muta valorile cookie-ului. Puteți utiliza net/http/cookiejar
pachet pentru a crea borcan cookie personalizat.
câmpul Timeout
specifică limita de timp înainte de care trebuie citit răspunsul. Dacă valoarea câmpului dacă 0
ceea ce înseamnă că nu există nici un timeout implementat de client HTTP. Această valoare indică timpul până la citirea completă a răspunsului final, care include toate redirecționările și citirea răspunsului.,
⚠️ Deoarece valoarea implicită
Timeout
câmp este0
, ar putea fi periculos în unele scenarii în cazul în care un malware de servicii nu trimite niciodată un răspuns, obositor de lățime de bandă, și cauza alte probleme. Prin urmare, asigurați-vă că pentru a adăuga unele timeout pentru fiecare cerere care provine de la aparat.
Pentru a verifica dacă codul de eroare returnat de către *Client.Get
(sau orice altă metodă) se datorează timeout, ar trebui să verificați err.Timeout()
valoare., Dacă timeout-ul are loc în timp ce citiți corpul de răspuns, acesta va returna o eroare.
să creăm un client nou cu o valoare mică de expirare și să trimitem o simplă solicitare HTTP GET
. Vom seta valoarea timeout 100 milliseconds
și, deoarece există o probabilitate mare de timeout cerere, vom verifica, de asemenea, pentru o eroare de timeout.,
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.,
De eroare returnate de către Get
metoda (și alte metode) este întotdeauna de tipul de *url.Error
tip, avem nevoie pentru a extrage acest beton valoare de err
care este de tip error
interfață.
când eroarea apare din cauza unui timeout, metoda *Error.Temporary()
returneazătrue
. Și din rezultatul de mai jos, putem vedea că eroarea returnată de metoda Get
este într-adevăr din cauza unui timeout.