networking - pkg - Acceda a la respuesta HTTP como cadena en Go
go pkg (3)
El método que está utilizando para leer la respuesta del cuerpo http devuelve un segmento de bytes:
func ReadAll(r io.Reader) ([]byte, error)
Puede convertir
[]byte
a una cadena usando
body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)
Me gustaría analizar la respuesta de una solicitud web, pero tengo problemas para acceder a ella como una cadena.
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")
}
¿Cómo puedo acceder a la respuesta como cadena?
ioutil.WriteFile
escribe correctamente la respuesta a un archivo.
Ya he verificado la referencia del paquete, pero no es realmente útil.
string (byteslice) convertirá el segmento de bytes en string, solo sepa que no solo se trata de conversión de tipo, sino también de copia de memoria.
bs := string(body)
debería ser suficiente para darte una cadena.
A partir de ahí, puede usarlo como una cadena normal.
Un poco como en este hilo :
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)
}
Ver también GoByExample .
Como se comenta a continuación (y en la
answer
zzn
), esta es una
conversion
(ver
spec
).
Consulte "
¿Cuánto cuesta
[]byte(string)
?
" (Problema inverso, pero se aplica la misma conclusión) donde
zzzz
menciona:
Algunas conversiones son iguales a una conversión, como
uint(myIntvar)
, que simplemente reinterpreta los bits en su lugar.
Sonia agrega:
Hacer una cadena de un segmento de bytes, definitivamente implica asignar la cadena en el montón. La propiedad de inmutabilidad fuerza esto.
A veces puede optimizar haciendo tanto trabajo como sea posible con [] byte y luego creando una cadena al final. El tipobytes.Buffer
suele ser útil.