it-swarm.com.de

Greifen Sie auf die HTTP-Antwort als Zeichenfolge in Go zu

Ich möchte die Antwort einer Webanforderung analysieren, habe jedoch Probleme, darauf als Zeichenfolge zuzugreifen.

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 die Paketreferenz bereits überprüft, aber sie ist nicht wirklich hilfreich.

83
Tibor Szasz

bs := string(body) sollte ausreichen, um Ihnen einen String zu geben.

Von dort können Sie es als reguläre Zeichenfolge verwenden.

Ein bisschen wie in diesem 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)
}

Siehe auch GoByExample .

Wie unten (und in zzn 's Antwort ) kommentiert, ist dies ein Konvertierung (siehe spec ).
Siehe " Wie teuer ist []byte(string)? " (umgekehrtes Problem, aber die gleiche Schlussfolgerung gilt), wobei zzzz erwähnt wird:

Einige Konvertierungen sind die gleichen wie eine Besetzung, wie uint(myIntvar), die nur die Bits an Ort und Stelle neu interpretiert.

Sonia fügt hinzu:

Das Erstellen eines Strings aus einem Byte-Slice beinhaltet definitiv das Zuweisen des Strings auf dem Heap. Die Unveränderlichkeitseigenschaft erzwingt dies.
Manchmal können Sie optimieren, indem Sie mit [] Byte so viel Arbeit wie möglich ausführen und am Ende einen String erstellen. Der Typ bytes.Buffer ist oft nützlich.

151
VonC

Die Methode, mit der Sie die HTTP-Body-Antwort lesen, gibt einen Byte-Slice zurück:

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

offizielle Dokumentation

Sie können []byte Mit in einen String konvertieren

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

string (byteslice) konvertiert Byte-Slice in String. Sie müssen lediglich wissen, dass es sich nicht nur um eine Typkonvertierung handelt, sondern auch um eine Speicherkopie.

1
zzn