218 votes

Accéder à la réponse HTTP en tant que chaîne de caractères dans Go

J'aimerais analyser la réponse d'une requête web, mais j'ai des difficultés à y accéder sous forme de chaîne.

func main() {
    resp, err := http.Get("http://google.hu/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    ioutil.WriteFile("dump", body, 0600)

    for i:= 0; i < len(body); i++ {
        fmt.Println( body[i] ) // This logs uint8 and prints numbers
    }

    fmt.Println( reflect.TypeOf(body) )
    fmt.Println("done")
}

Comment puis-je accéder à la réponse en tant que chaîne de caractères ? ioutil.WriteFile écrit correctement la réponse dans un fichier.

J'ai déjà vérifié la référence du paquet mais ce n'est pas vraiment utile.

365voto

VonC Points 414372

bs := string(body) devrait être suffisant pour vous donner une chaîne.

À partir de là, vous pouvez l'utiliser comme une chaîne ordinaire.

Un peu comme dans ce fil :

var client http.Client
resp, err := client.Get(url)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusOK {
    bodyBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

Voir aussi GoByExample .

Comme commenté ci-dessous (et dans zzn 's réponse ), il s'agit d'un conversion (voir spec ).
Voir " Quel est le coût de la []byte(string) ? " (problème inverse, mais la même conclusion s'applique) où zzzz mentionné :

Certaines conversions sont identiques à un moulage, par exemple uint(myIntvar) qui ne fait que réinterpréter les bits en place.

Sonia ajoute :

Faire une chaîne de caractères à partir d'une tranche d'octet, implique définitivement l'allocation de la chaîne de caractères sur le tas. La propriété d'immuabilité l'impose.
Parfois, vous pouvez optimiser en faisant le plus de travail possible avec []byte et en créant une chaîne à la fin. Le site bytes.Buffer est souvent utile.

1 votes

Merci. Avez-vous une suggestion sur la façon dont j'aurais pu le découvrir par moi-même ? Comment string() fait-il cela ? Pourquoi je ne peux pas le voir avec reflect.TypeOf ?

1 votes

@TiborSzasz Il s'agit d'une simple conversion : voir blog.golang.org/slices#TOC_12 .

1 votes

Une petite amélioration de votre code serait d'utiliser http.StatusOK au lieu de la version brute 200 valeur !

52voto

tsabsch Points 759

La méthode que vous utilisez pour lire le corps de la réponse http renvoie une tranche d'octets :

func ReadAll(r io.Reader) ([]byte, error)

documentation officielle

Vous pouvez convertir []byte à une chaîne de caractères en utilisant

body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)

1voto

zzn Points 1341

String(byteslice) convertira la tranche d'octet en chaîne, sachez que ce n'est pas seulement une simple conversion de type, mais aussi une copie de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X