faire des requêtes personnalisées
Jusqu’à présent, nous avons appris à faire des requêtes HTTP simples, mais nous ne nous sommes pas trop concentrés sur la personnalisation des demandes, comme définir des en-têtes de requête personnalisés ou créerPUT
,PATCH
EtDELETE
(et autres) requêtes HTTP.
http.Structure de requête
la structure http.Request
configure la requête à envoyer., La balise Get
, Post
et d’autres méthodes exposées par le *http.Client
en fait, construction http.Request
objet en interne pour envoyer la demande.
Cette structure a plusieurs champs pour configurer la connexion TLS, la connexion keep-alive, les données de formulaire et d’autres paramètres, mais les champs suivants sont une configuration minimale avec laquelle nous pouvons travailler.
💡 Vous pouvez en lire plus à propos de
Request
struct à partir d’ici.,
la structure*http.Request
implémente de nombreuses méthodes pour modifier l’objet request avant son envoi. La méthode *Request.AddCookie
ajoute un cookie sur l’objet de requête et *Request.SetBasicAuth
définit l’en-tête d’autorisation de base sur la requête. Vous pouvez explorer ces méthodes à partir d’ici.
Une fois que nous construisons un objet request, nous devons faire une requête avec cet objet request manuellement. Pour cela, nous devons utiliser la méthode*Client.Do
. Puisque Go fournit http.DefaultClient
, nous pouvons l’utiliser pour faire une demande.,
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.,
le corps de La requête stockée dans Request.Body
champ doit être un objet qui implémente io.ReadCloser
interface (un groupe de io.Reader
et io.Closer
interfaces). La balise strings.NewReader
renvoie un io.Reader
objet et ioutil.NopCloser
fonction ajoute Close()
méthode sur le io.Reader
objet.
la méthodeClose
ajoutée par la fonctionNopCloser
ne fait rien, elle renvoie simplement une erreurnil
., Le corps de la requête est fermé pour les E/S via cet appel de méthode Close()
lorsque la requête est envoyée. Dans un cas d’utilisation réel, vous devez implémenter correctement la méthode Close
pour désactiver les E/S sur le corps de la requête.
nous avons également initialisé le champHeader
avec quelques en-têtes de requête initiaux. Pour envoyer la demande, nous utilisons la méthodeDefaultClient.Do
qui renvoie la réponse réseau et une erreurnon-nil
si la demande échoue.,
🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}
je suis d’accord, envoyer une demande personnalisée semble plutôt compliqué mais nous pouvons utiliser la fonctionhttp.NewRequest
pour construire*http.Request
objet à partir de quelques valeurs simples qui a la syntaxe suivante.
func NewRequest(method, url string, body io.Reader) (*Request, error)
Cette fonction renvoie un *http.Request
objet et un non-nil
erreur dans le cas où certaines valeurs des paramètres ne sont pas valides. Si method
argument est vide, GET
demande est supposée., We can add headers to the returned *Request
object.
The program above returns the same response as the earlier example., Même si reqBody
n’implémente pas l’interface io.Closer
, elle devrait idéalement implémenter une méthode Close
valide qui désactive les E/S, sinon, Go y ajoute une méthode de fermeture sans opération en utilisant la fonction ioutil.NopCloser
.
http.Structure du Client
la structure http.Client
crée un client HTTP avec une configuration qui peut envoyer des requêtes HTTP. Lehttp.DefaultClient
est un pointeur vers un objethttp.Client
vide qui expose un client HTTP par défaut.,
var DefaultClient = &http.Client{}
Comme nous l’avons vu auparavant, la balise *http.Client
implémente Get
, Post
, PostForm
, Head
et Do
méthodes. Voyons à quoi ressemble le type de structure http.Client
.
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
}
Le Transport
champ d’un objet qui implémente l’ RoundTrip
méthode. Cet objet est responsable d’exécuter une seule requête HTTP et de renvoyer une réponse., Si ce champ la valeur est nil
, http.DefaultTransport
de type *http.Transport
est utilisé. Dans la plupart des cas, cette valeur par défaut est suffisante pour nous.
le champ CheckRedirect
est une fonction qui vérifie si la redirection demandée par une réponse doit être suivie. Si cette valeur est nil
, la politique par défaut de maximum 10
redirections est utilisé.
l’argumentreq
est la requête la plus récente et l’argumentvia
contient les requêtes plus anciennes (dans l’ancien premier ordre)., Si cette fonction renvoie une erreurnon-nil
, la tentative de redirection est bloquée. Consultez cette documentation pour en savoir plus sur la façon dont la réponse est renvoyée et les types d’erreur.
le champJar
spécifie un mécanisme pour ajouter des cookies sur les requêtes HTTP sortantes et mettre en cache les cookies des réponses entrantes. Ce cookie jar est consulté pour chaque demande sortante et redirigée.
Si cette valeur estnil
, les cookies ne sont envoyés que s’ils sont spécifiés dans la requête (et copiés dans les requêtes redirigées)., Dans le cas d’une requête redirigée, cookie jar peut muter les valeurs du cookie. Vous pouvez utiliser le packagenet/http/cookiejar
pour créer votre cookie jar personnalisé.
Le Timeout
champ spécifie le délai avant lequel la réponse doit être lu. Si la valeur du champ if 0
ce qui signifie qu’il n’y a pas de délai d’expiration implémenté par le client HTTP. Cette valeur indique le temps jusqu’à ce que la réponse finale soit entièrement lue, ce qui inclut toutes les redirections et la lecture de la réponse.,
️ ️ étant donné que la valeur par défaut du champ
Timeout
est0
, cela pourrait être dangereux dans certains scénarios où un service malveillant n’envoie jamais de réponse, épuisant votre bande passante et causant d’autres problèmes. Par conséquent, assurez-vous d’ajouter un délai d’attente pour chaque demande provenant de votre machine.
pour vérifier si l’erreur renvoyée par la*Client.Get
(ou toute autre méthode) est due à un délai d’attente, nous devons vérifier la valeurerr.Timeout()
., Si le délai d’attente se produit lors de la lecture du corps de la réponse, il renverra une erreur.
créons un nouveau client avec une petite valeur de délai d’attente et envoyons une simple requête HTTPGET
. Nous allons définir la valeur de délai 100 milliseconds
Et comme il y a une forte probabilité de délai d’expiration de la demande, nous vérifierons également une erreur de délai d’expiration.,
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.,
étant donné que l’erreur renvoyée par la méthode Get
(et d’autres méthodes) est toujours du type *url.Error
, nous devons extraire cette valeur concrète de la err
qui est du type error
interface.
Lorsque l’erreur se produit en raison d’un délai d’attente, la balise *Error.Temporary()
méthode renvoie true
. Et à partir du résultat ci-dessous, nous pouvons voir que l’erreur renvoyée par la méthode Get
est en effet due à un délai d’attente.