2016-07-30 9 views
34

Ich möchte die Antwort einer Webanforderung analysieren, aber ich bekomme Probleme als String zugreifen.Greifen Sie HTTP-Antwort als Zeichenfolge in Go

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

Wie kann ich auf die Antwort als Zeichenfolge zugreifen? ioutil.WriteFile schreibt die Antwort auf eine Datei korrekt.

Ich habe bereits die Paket-Referenz überprüft, aber es ist nicht wirklich hilfreich.

Antwort

53

bs := string(body) sollte ausreichen, um Ihnen eine Zeichenfolge zu geben.

Von dort können Sie es als eine normale Zeichenfolge verwenden.

Ein bisschen wie in this thread:

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

if resp.StatusCode == http.StatusOK { 
    bodyBytes, err2 := ioutil.ReadAll(resp.Body) 
    bodyString := string(bodyBytes) 
} 

Siehe auch GoByExample.

Wie unten (und in zzn ‚s answer) kommentiert, ist dies ein conversion (siehe spec).
Siehe „How expensive is []byte(string)?“ (umgekehrtes Problem, aber die gleiche Schlussfolgerung gilt), wo zzzz erwähnt:

Einige Umwandlungen sind die gleiche wie ein Guss, wie uint(myIntvar), die nur die Bits an Ort und Stelle neu interpretiert.

Sonia ergänzt:

eine Zeichenfolge aus einem Byte-Slice zu machen, auf jeden Fall beinhaltet das auf dem Heap die Zeichenfolge zuordnet. Die Unveränderlichkeitseigenschaft zwingt dies.
Manchmal können Sie optimieren, indem Sie so viel Arbeit wie möglich mit [] Byte ausführen und dann am Ende eine Zeichenfolge erstellen. Der bytes.Buffer Typ ist oft nützlich.

+0

Danke. Hast du irgendeinen Vorschlag, wie ich es alleine hätte herausfinden können? Wie macht string() das? Warum kann ich es nicht mit reflect.TypeOf sehen? –

+1

@TiborSzasz Es ist eine einfache Konvertierung: siehe https://blog.golang.org/slices#TOC_12. – VonC

+0

@TiborSzasz Bei der Konvertierung: https://golang.org/ref/spec#Conversions – VonC

4

Die Methode, die Sie verwenden die HTTP-Reaktion des Körpers zu lesen gibt ein Byte Scheibe:

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

official documentation

Sie []byte in einen String konvertieren kann durch

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

Danke für die Antwort! –

1
mit

string (byteslice) wird Byte-Slice in String umwandeln, nur wissen, dass es nicht nur Typ Konvertierung ist, b ut auch Speicherkopie.