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)

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

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

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

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

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

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *