aangepaste verzoeken maken

tot nu toe hebben we geleerd hoe eenvoudige HTTP-verzoeken te maken, maar we hebben ons niet te veel gefocust op aanpassing van verzoeken, zoals het instellen van aangepaste request headers of het maken van PUT, PATCH en DELETE (en anderen) HTTP-verzoeken.

http.Aanvraagstructuur

de http.Request struct configureert het verzoek dat moet worden verzonden., HetGet,Post en andere methoden die blootstaan aan het*http.Client construeren eigenlijkhttp.Request object intern om het verzoek te verzenden.

deze structuur heeft meerdere velden om TLS-verbinding, keep-alive-verbinding, formuliergegevens en andere instellingen te configureren, maar de volgende velden zijn minimale configuratie waarmee we kunnen werken.

💡 u kunt hier meer lezen over Request struct.,

de *http.Request struct implementeert vele methoden om het verzoekobject te wijzigen voordat het wordt verzonden. De methode *Request.AddCookie voegt een cookie toe aan het aanvraagobject en *Request.SetBasicAuth stelt de standaard autorisatieheader in op het verzoek. U kunt deze methoden vanaf hier verkennen.

zodra we een request object construeren, moeten we een request met dit request object handmatig maken. Daarvoor moeten we *Client.Do methode gebruiken. Aangezien Go http.DefaultClient levert, kunnen we dat gebruiken om een verzoek in te dienen.,

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

het aanvraagbestand opgeslagen in Request.Body veld moet een object zijn dat io.ReadCloser interface implementeert (een groep van io.Reader en io.Closer interfaces). De strings.NewReader geeft een io.Reader object en ioutil.NopCloser functie voegt Close() methode toe op het io.Reader object.

De Close methode toegevoegd door de NopCloser functie doet niets, het geeft gewoon een nil fout., Het aanvraagorgaan wordt gesloten voor I/O via deze Close() methodeaanroep wanneer het verzoek wordt verzonden. In een real-world use case, moet u Close methode correct implementeren om I/O op de aanvraag body uit te schakelen.

we hebben ook het Header veld geïnitialiseerd met enkele initiële request headers. Om het verzoek te verzenden, gebruiken we DefaultClient.Do methode die de netwerkrespons retourneert en een non-nil fout als het verzoek mislukt.,

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

Ik ga akkoord, het verzenden van een aangepast verzoek lijkt nogal ingewikkeld, maar we kunnen de http.NewRequest functie gebruiken om *http.Request object te construeren uit enkele eenvoudige waarden die de volgende syntaxis hebben.

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

Deze functie geeft een *http.Request object en een non-nil fout in het geval dat sommige argumentwaarden niet geldig zijn. Als method argument leeg is, wordt GET verzoek aangenomen., 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., Hoewel reqBody io.Closer interface niet implementeert, zou het idealiter een geldige Close methode moeten implementeren die I/O uitschakelt, else, Go voegt er een no-op close methode aan toe met ioutil.NopCloser functie.

http.Clientstructuur

dehttp.Client structuur maakt een HTTP-client aan met enige configuratie die HTTP-verzoeken kan verzenden. Hethttp.DefaultClient is een verwijzing naar een leeghttp.Client object dat een standaard HTTP-client blootlegt.,

var DefaultClient = &http.Client{}

Zoals we eerder hebben gezien, de *http.Client implementeert Get, Post, PostForm, Head en Do methoden. Laten we eens kijken hoe http.Client het structuurtype eruit ziet.

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
}

het Transport veld een object dat de methode RoundTrip implementeert. Dit object is verantwoordelijk voor het uitvoeren van een enkele HTTP-aanvraag en het retourneren van een antwoord., Als deze veldwaarde nil is, wordt http.DefaultTransport van het type *http.Transport gebruikt. In de meeste gevallen is deze standaardwaarde goed genoeg voor ons.

het veld CheckRedirect is een functie die controleert of redirection vereist door een antwoord moet worden gevolgd. Als deze waarde nil is, wordt het standaardbeleid van maximum 10 omleidingen gebruikt.

het req argument is het nieuwste verzoek en via argument bevat de oudere verzoeken (in oude Eerste volgorde)., Als deze functie een non-nil fout teruggeeft, wordt de omleidingspoging geblokkeerd. Controleer deze documentatie om meer te weten te komen over hoe het antwoord wordt geretourneerd en de fouttypen.

het Jar veld specificeert een mechanisme om cookies toe te voegen op uitgaande HTTP-verzoeken en cachecookies van de inkomende reacties. Deze cookie pot wordt geraadpleegd voor elke uitgaande en doorgestuurd verzoek.

als deze waarde nil is, worden cookies alleen verzonden als ze zijn opgegeven op het verzoek (en gekopieerd naar omgeleide Verzoeken)., In het geval van een doorgestuurd verzoek kan de Cookie jar de waarden van de cookie muteren. U kunt het pakket net/http/cookiejar gebruiken om uw aangepaste koekjestrommel te maken.

het veld Timeout geeft de termijn aan waarbinnen het antwoord moet worden gelezen. If de veldwaarde if 0 wat betekent dat er geen time-out is geà mplementeerd door de HTTP-client. Deze waarde geeft de tijd aan totdat het uiteindelijke antwoord volledig is gelezen, inclusief alle omleidingen en het lezen van het antwoord.,

⚠ ️ aangezien de standaardwaarde van Timeout veld 0 is, kan het gevaarlijk zijn in sommige scenario ‘ s waar een kwaadwillende dienst nooit een antwoord stuurt, uw bandbreedte uitputtend maakt en andere problemen veroorzaakt. Zorg er daarom voor dat u een time-out toevoegt voor elk verzoek dat afkomstig is van uw machine.

om te controleren of de fout die wordt geretourneerd door de *Client.Get (of een andere methode) te wijten is aan Time-Out, moeten we err.Timeout() waarde controleren., Als de time-out optreedt tijdens het lezen van de reactietekst, wordt een fout geretourneerd.

laten we een nieuwe client maken met een kleine timeout waarde en een eenvoudig HTTP GET verzoek sturen. We zullen de time-outwaarde 100 milliseconds instellen en omdat er een grote kans is op een time-out, zullen we ook controleren op een time-outfout.,

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

aangezien de fout die wordt geretourneerd door de Get methode (en andere methoden) altijd van het type *url.Error type is, moeten we deze concrete waarde extraheren uit de err die van het type error interface.

wanneer de fout optreedt als gevolg van een time-out, geeft de methode *Error.Temporary() trueterug. En uit het onderstaande resultaat kunnen we zien dat de fout die wordt geretourneerd door de Get methode inderdaad het gevolg is van een time-out.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *