Maison  >  Article  >  développement back-end  >  délai d'expiration de la requête http golang

délai d'expiration de la requête http golang

WBOY
WBOYoriginal
2023-05-13 10:37:072312parcourir

Lorsque vous utilisez Golang pour développer des services http, vous pouvez rencontrer des problèmes de délai d'expiration des requêtes. Ce type de problème peut affecter la stabilité et la fiabilité du service, il faut donc trouver une solution. Cet article présentera le problème de délai d'expiration des requêtes http de Golang et sa solution.

  1. Description du problème

Dans les services http, le délai d'attente des requêtes est un problème courant. Par exemple, lorsque le client envoie une requête, si le serveur ne répond pas dans le délai spécifié ou si une erreur se produit lors de la réponse, la requête expirera.

Dans Golang, ce problème peut être résolu en définissant l'attribut Timeout dans Client ou l'attribut Timeout dans http.Transport.

  1. Set Client Timeout

http.Le client dans Golang fournit une propriété Timeout pour définir le délai d'expiration de la demande. Par défaut, la propriété Timeout est définie sur zéro, ce qui indique qu'il n'y a aucune limite de délai d'attente. Lorsque l'attribut Timeout est défini sur une valeur non nulle, le serveur attendra une réponse dans le délai spécifié.

Par exemple, le code suivant définit un délai d'expiration de 2 secondes :

client := &http.Client{
    Timeout: time.Second * 2,
}

Lorsque la requête expire, une erreur de délai d'attente sera renvoyée (net/http : requête annulée (Client.Timeout dépassé en attente des entêtes)). Les erreurs peuvent être générées ou traitées en conséquence en fonction des besoins réels. net/http: request canceled (Client.Timeout exceeded while awaiting headers))。可以根据实际需求抛出错误或进行相应的处理。

  1. 设置http.Transport Timeout

除了设置http.Client的Timeout属性外,还可以通过设置http.Transport的属性来控制请求超时。具体来说,可以设置DialTimeout、TLSHandshakeTimeout、ResponseHeaderTimeout、ExpectContinueTimeout等属性。

例如,以下代码设置了一个2秒的DialTimeout:

transport := &http.Transport{
    DialContext: (&net.Dialer{
        Timeout:   2 * time.Second,
        KeepAlive: 30 * time.Second,
    }).DialContext,
    MaxIdleConns:        100,
    IdleConnTimeout:     90 * time.Second,
    TLSHandshakeTimeout: 2 * time.Second,
}
client := &http.Client{
    Timeout:   time.Second * 2,
    Transport: transport,
}

当超时时,会返回一个超时错误(dial tcp: i/o timeout

    Set http.Transport Timeout
    1. En plus de définir la propriété Timeout de http.Client, vous pouvez également définir http .Propriétés de transport pour contrôler le délai d'expiration de la demande. Plus précisément, vous pouvez définir des propriétés telles que DialTimeout, TLSHandshakeTimeout, ResponseHeaderTimeout et ExpectContinueTimeout.

    Par exemple, le code suivant définit un DialTimeout de 2 secondes :

    rrreee#🎜🎜#Lorsque le délai d'attente se produit, une erreur de délai d'attente sera renvoyée (dial tcp: i/ o délai d'attente). Les erreurs peuvent être générées ou traitées en conséquence en fonction des besoins réels. #🎜🎜##🎜🎜##🎜🎜#Summary#🎜🎜##🎜🎜##🎜🎜#Dans Golang, la définition du délai d'expiration de la demande est une mesure importante pour garantir la stabilité et la fiabilité du service. Le contrôle du délai d'attente des requêtes peut être obtenu en définissant la propriété Timeout de http.Client ou la propriété de http.Transport. Dans le développement réel, il est nécessaire de définir un délai d'attente approprié en fonction des exigences pour garantir le fonctionnement normal du service. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn