Accedi alla risposta HTTP come stringa in Go


123

Vorrei analizzare la risposta di una richiesta web, ma ho problemi ad accedervi come stringa.

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")
}

Come posso accedere alla risposta come stringa? ioutil.WriteFilescrive correttamente la risposta in un file.

Ho già controllato il riferimento del pacchetto ma non è molto utile.

Risposte:


221

bs := string(body) dovrebbe essere sufficiente per darti una stringa.

Da lì, puoi usarlo come una stringa normale.

Un po 'come in questo thread :

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)
}

Vedi anche GoByExample .

Come ha commentato di seguito (e in zZn 's risposta ), si tratta di una conversione (vedi spec ).
Vedi " Quanto costa []byte(string)? " (Problema inverso, ma si applica la stessa conclusione) dove zzzz ha menzionato:

Alcune conversioni sono le stesse di un cast, come uint(myIntvar), che reinterpreta semplicemente i bit sul posto.

Sonia aggiunge:

Creare una stringa da una fetta di byte, implica sicuramente l'allocazione della stringa nell'heap. La proprietà di immutabilità lo impone.
A volte è possibile ottimizzare facendo quanto più lavoro possibile con [] byte e quindi creando una stringa alla fine. Il bytes.Buffertipo è spesso utile.


Grazie. Hai qualche suggerimento su come avrei potuto capirlo da solo? Come fa string () a farlo? Perché non riesco a vederlo con Reflect.TypeOf?
Tibor Szasz

1
@TiborSzasz È una semplice conversione: vedi blog.golang.org/slices#TOC_12 .
VonC

Un piccolo miglioramento al tuo codice sarebbe quello di utilizzare al http.StatusOKposto del 200valore grezzo !
Shadoninja

Ho fatto questo e ho scoperto che i corpi della mia richiesta hanno sempre un carattere di nuova riga alla fine. È normale per un corpo di richiesta o è causato da ioutil.ReadAll()??
sixty4bit

29

Il metodo che stai utilizzando per leggere la risposta del corpo http restituisce una fetta di byte:

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

documentazione ufficiale

Puoi convertire []bytein una stringa usando

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

1

string (byteslice) convertirà la fetta di byte in stringa, sappi solo che non è solo una semplice conversione del tipo, ma anche una copia della memoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.