Maison  >  Article  >  développement back-end  >  golang http obtient un code tronqué

golang http obtient un code tronqué

WBOY
WBOYoriginal
2023-05-15 09:00:12934parcourir

Ces dernières années, avec la popularité du langage Go, de plus en plus de personnes ont commencé à utiliser le langage Go pour développer des applications Web, y compris des programmes qui utilisent HTTP pour l'accès au réseau. Cependant, rencontrer des caractères tronqués dans les requêtes HTTP GET est un problème courant. Cet article explorera ce problème, ses causes possibles et proposera quelques solutions.

1. Description du problème

Lors de l'écriture de requêtes HTTP GET en langage Go, nous rencontrons parfois le problème d'un texte tronqué. Le principal symptôme est que le corps de la réponse renvoyé par la requête contient des caractères tronqués au lieu des résultats attendus.

2. Cause du problème

Il peut y avoir plusieurs raisons pour lesquelles les requêtes HTTP GET sont tronquées. Voici quelques raisons courantes :

1. Le jeu de caractères correct n'est pas utilisé. Dans l'en-tête de réponse de la requête HTTP, le serveur renverra le jeu de caractères du document. Si nous n'analysons pas correctement cette valeur, cela peut provoquer des problèmes d'encodage.

2. Aucun jeu de caractères spécifié. Parfois, le serveur ne fournit pas d'informations sur le jeu de caractères. Si nous ne spécifions pas de jeu de caractères, cela peut entraîner des problèmes d'encodage.

3. Le jeu de caractères ne correspond pas. Parfois, les jeux de caractères dans l’en-tête de requête et dans l’en-tête de réponse ne correspondent pas, ce qui peut entraîner des caractères tronqués.

4. Lors de la lecture des données d'un fichier, l'encodage spécifié est incohérent avec l'encodage réel, ce qui peut également provoquer des caractères tronqués.

3. Solution

1. Vérifiez le jeu de caractères de la réponse du serveur

 : Dans HTTP GET, l'en-tête de réponse du serveur contient des informations sur le jeu de caractères. Si nous ne vérifions pas et n’analysons pas correctement cette valeur, cela peut entraîner des caractères tronqués. La méthode correcte consiste à utiliser la méthode resp.Header.Get("Content-Type") fournie dans la bibliothèque net/http du langage Go pour obtenir les informations d'en-tête de réponse Content-Type et en obtenir la valeur du jeu de caractères. Nous devons ensuite utiliser ce jeu de caractères pour convertir le corps de la réponse en chaîne correcte. Par exemple, si le caractère défini dans l'en-tête de réponse est UTF-8, nous pouvons utiliser la méthode suivante pour convertir le corps de la réponse en une chaîne codée en UTF-8.

import (
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://example.com/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        // handle error
    }

    contentType := resp.Header.Get("Content-Type")
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }

    // convert body bytes to string
    var content string
    if strings.Contains(contentType, "UTF-8") {
        content = convertToString(string(body), "UTF-8", "UTF-8")
    } else {
        content = convertToString(string(body), contentType, "UTF-8")
    }
}

func convertToString(content string, srcEncoding string, destEncoding string) string {
    srcDecoder := charmap.Windows1252.NewDecoder()
    srcReader := strings.NewReader(content)
    srcReader.Reset(content)
    srcUTF8Reader := transform.NewReader(srcReader, srcDecoder)
    destDecoder := charmap.ISO8859_1.NewDecoder()
    destWriter := new(bytes.Buffer)
    destUTF8Writer := transform.NewWriter(destWriter, destDecoder)
    io.Copy(destUTF8Writer, srcUTF8Reader)
    return destWriter.String()
}

2. Spécifiez le jeu de caractères correct

Lors de l'envoi d'une requête HTTP GET, nous devons spécifier le jeu de caractères dans l'en-tête de la requête. Dans ce cas, nous devons utiliser la méthode Req.Header.Set("Content-Type", "text/html; charset=UTF-8") fournie dans la bibliothèque net/http du langage Go pour spécifier le Content-Type. Par exemple, si nous voulons envoyer du texte UTF-8 en utilisant l'encodage UTF-8, nous pouvons utiliser le code suivant :

import (
    "net/http"
)

func main() {
    client := http.Client{}
    req, err := http.NewRequest("GET", "http://example.com/", nil)
    if err != nil {
        // handle error
    }

    req.Header.Set("Content-Encoding", "gzip")
    req.Header.Set("Content-Type", "text/html; charset=UTF-8")

    resp, err := client.Do(req)
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
}

3. Conversion du jeu de caractères

Si nous spécifions le jeu de caractères correct mais rencontrons toujours le problème des caractères tronqués , alors peut-être que la conversion du jeu de caractères doit être effectuée sur le contenu renvoyé. Nous pouvons utiliser la méthode transform.String() fournie dans la bibliothèque golang.org/x/text/transform du langage Go pour convertir des chaînes. Par exemple, supposons que nous lisions un texte codé ISO-8859-1 à partir du fichier, mais que le serveur renvoie du texte codé UTF-8, nous pouvons utiliser le code suivant pour convertir :

import (
    "bytes"
    "io"
    "io/ioutil"
    "net/http"
    "golang.org/x/text/transform"
    "golang.org/x/text/encoding/charmap"
)

func main() {
    resp, err := http.Get("http://example.com/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        // handle error
    }

    // read body
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }

    // convert body bytes to string
    s, _, err := transform.String(charmap.ISO8859_1.NewDecoder().Transformer(), string(body))
    if err != nil {
        // handle error
    }

    // do something with s
    ...
}

4. Conclusion

HTTP GET Caractères tronqués dans Les requêtes peuvent affecter les résultats de vos requêtes réseau. Si vous rencontrez ce problème, vérifiez d'abord les informations sur le jeu de caractères, puis vérifiez que le jeu de caractères est correctement spécifié. Si aucune des solutions ci-dessus ne résout votre problème, vous devrez peut-être effectuer une conversion du jeu de caractères. J'espère que les méthodes fournies dans cet article pourront vous aider à résoudre le problème tronqué des requêtes HTTP GET.

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
Article précédent:Le golang est-il populaire ?Article suivant:Le golang est-il populaire ?