2016-08-06 25 views
15

Wykonuję żądanie HTTP GET do punktu końcowego, który zwraca odpowiedź tekstową.Jak obsługiwać zwykły tekst HTTP Uzyskaj odpowiedź w Golang?

Jak mogę pobrać ciąg odpowiedzi tekstowej?

Mój kod wygląda następująco:

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 

Odpowiedz

26

Reakcja organizmu można odczytać za pomocą jakiejkolwiek metody, które mogą odczytywać dane z przychodzącego strumienia bajtów. Najprostszym z nich jest funkcja ReadAll zawarta w pakiecie ioutil.

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

Zapewni to odpowiedź API w bajcie []. Jeśli odpowiedź jest zwykły tekst można łatwo przekonwertować go na ciąg przy użyciu typu konwersji:

responseString := string(responseData) 

i sprawdzić wyniki

fmt.Println(responseString) 

Przykładowy program:

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

Jeśli masz stronę internetową z (np.) Hiszpańskim/włoskim/etc. znaków, nie uzyskasz dobrego wyniku konwersji 'bajtu' na' ciąg'. Dokładnie, takie postacie jak 'é',' á', itp. Dostaniesz postać. Potrzebujesz iteracji 'responseData' i konkatowania każdej postaci. Zoptymalizowanym sposobem byłoby [to] (https://play.golang.org/p/IPKmytFOEd) ;-) –

+0

Odpowiedź @Amd rozwiązuje problem tekstu Unicode w ten sam sposób co poprzedni komentarz, jednak myślę, że lepiej ;-) –

2

Korzystając ioutil.ReadAll(response.Body).

także może obsługiwać tekst Unicode przy użyciu bufio.NewScanner(response.Body)
jak ten przykładowy kod robocza:

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

wyjściowa:

*Hello World* B=µH * 

Korzystanie z tej próbki kodu serwer internetowy:

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

Dzięki @Amd za odpowiedź! , Nie znałem tego sposobu dekodowania tablicy bajtów tekstu Unicode na ciąg znaków, a dla mnie był to ból głowy ... :-) –

+0

@ToniVillena Dzięki za zachęcanie –

0

Z io.Copy czytasz wszystkie bajty z io.Reader i zapisujesz je do 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())