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)
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.
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
veld0
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.,
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()
true
terug. 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.