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)

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

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éthodeCloseajoutée par la fonctionNopCloserne 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.

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

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’argumentreqest 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 champTimeout 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.,

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

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *