2016-08-06 16 views
15

Ich mache eine HTTP-GET-Anfrage an einen Endpunkt, der eine einfache Textantwort zurückgibt.Wie handhabe ich Klartext HTTP Antwort erhalten in Golang?

Wie greife ich die Zeichenfolge der Klartextantwort?

Mein Code sieht wie folgt aus:

url := "http://someurl.com" 
    response,err := http.Get(url) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    responseString := //NOT SURE HOW TO GRAB THE PLAIN TEXT STRING 

Antwort

26

Reaktion des Körpers jede Methode gelesen werden können, unter Verwendung von Daten, die aus den eingehenden Bytestrom lesen konnte. Am einfachsten ist die ReadAll-Funktion, die im ioutil-Paket enthalten ist.

responseData,err := ioutil.ReadAll(response.Body) 
if err != nil { 
    log.Fatal(err) 
} 

Es gibt Ihnen API-Antwort in [] Byte. Wenn Antwort Klartext ist, können Sie diese leicht in Zeichenfolge konvertieren Typ Konvertierung mit:

responseString := string(responseData) 

und prüfen Sie das Ergebnis

fmt.Println(responseString) 

Beispielprogramm:

package main 

import (
    "fmt" 
    "io/ioutil" 
    "log" 
    "net/http" 
) 

func main() { 
    url := "http://country.io/capital.json" 
    response, err := http.Get(url) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    responseData, err := ioutil.ReadAll(response.Body) 
    if err != nil { 
     log.Fatal(err) 
    } 

    responseString := string(responseData) 

    fmt.Println(responseString) 
} 
+1

Wenn Sie eine Webseite mit (für z) Spanisch/Italienisch/etc bekommen. Zeichen, erhalten Sie kein gutes Ergebnis bei der Umwandlung von '[] Byte in' String'. Genau, Zeichen wie "é", "á" usw. erhalten Sie Zeichen. Sie müssen die 'responseData' durchlaufen und jedes Zeichen zusammenführen. Ein optimierter Weg wäre [this] (https://play.golang.org/p/IPKmytFOEd) ;-) –

+0

@Amds Antwort löst das Problem des Unicode-Textes auf die gleiche Weise wie mein vorheriger Kommentar, allerdings denke ich besser ;-) –

2

Verwendung ioutil.ReadAll(response.Body).

Auch Sie können Unicode-Text behandeln bufio.NewScanner(response.Body)
wie dieser Arbeitsbeispielcode verwenden:

package main 

import (
    "bufio" 
    "bytes" 
    "fmt" 
    "log" 
    "net/http" 
) 

func main() { 
    response, err := http.Get("http://127.0.0.1") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    scanner := bufio.NewScanner(response.Body) 
    scanner.Split(bufio.ScanRunes) 
    var buf bytes.Buffer 
    for scanner.Scan() { 
     buf.WriteString(scanner.Text()) 
    } 
    fmt.Println(buf.String()) 
} 

Ausgang:

*Hello World* B=µH * 

Unter Verwendung dieser Probe Web-Server-Code:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

func ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    body := "*Hello World* B=µH *" 
    fmt.Fprint(w, body) 
} 

func main() { 
    http.HandleFunc("/", ServeHTTP) 
    if err := http.ListenAndServe(":80", nil); err != nil { 
     log.Fatal(err) 
    } 
} 
+0

Danke @Amd für deine Antwort! , Ich wusste nicht, dass so ein Byte-Array von Unicode-Text zu String zu entschlüsseln, und für mich war Kopfschmerzen ... :-) –

+0

@ToniVillena Danke für die Ermutigung –

0

Mit io.Copy Sie lesen alle Bytes aus einem io.Reader, und schreiben Sie es auf ein io.Writer

resp, err := http.Get(server.URL + "/v1/ping") 
if err != nil { 
    t.Errorf("failed to execute GET request: %s", err) 
} 
defer resp.Body.Close() 

var b bytes.Buffer 
if _, err := io.Copy(&b, resp.Body); err != nil { 
    t.Errorf("failed to copy response body: %s", err) 
} 

fmt.Println(b.String())