web-dev-qa-db-fra.com

Accéder à la réponse HTTP sous forme de chaîne dans Go

J'aimerais analyser la réponse d'une requête Web, mais je ne parviens pas à 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 sous forme de chaîne? 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.

83
Tibor Szasz

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

De là, vous pouvez l'utiliser comme une chaîne normale.

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 indiqué ci-dessous (et dans zznréponse ), il s'agit d'un conversion (voir spec ).
Voir " Combien coûte []byte(string)? " (problème inverse, mais la même conclusion s'applique), où zzzz mentionné:

Certaines conversions sont identiques à un transtypage, comme uint(myIntvar), qui réinterprète simplement les bits en place.

Sonia ajoute:

Faire une chaîne à partir d’une tranche d’octets implique certainement l’affectation de la chaîne sur le tas. La propriété d'immutabilité force cela.
Parfois, il est possible d’optimiser en travaillant le plus possible avec [] octet puis en créant une chaîne à la fin. Le type bytes.Buffer est souvent utile.

151
VonC

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

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

documentation officielle

Vous pouvez convertir []byte en une chaîne en utilisant

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

string (byteslice) convertira une tranche d'octets en chaîne, sachez simplement qu'il ne s'agit pas simplement d'une conversion de type, mais également d'une copie en mémoire.

1
zzn