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.
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 typebytes.Buffer
est souvent utile.
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)
Vous pouvez convertir []byte
en une chaîne en utilisant
body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)
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.