2016-07-30 22 views
34

Chciałbym przeanalizować odpowiedź żądania sieci Web, ale mam problemy z uzyskaniem dostępu do niego jako ciąg.Uzyskaj odpowiedź HTTP jako ciąg w 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") 
} 

Jak uzyskać dostęp do odpowiedzi jako ciąg? ioutil.WriteFile poprawnie zapisuje odpowiedź do pliku.

Sprawdziłem już numer referencyjny przesyłki, ale nie jest to pomocne.

Odpowiedz

53

bs := string(body) powinno wystarczyć, aby podać ciąg.

Stamtąd można go używać jako zwykłego ciągu.

Trochę jak 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) 
} 

Zobacz także GoByExample.

W opisanej poniżej (oraz w zzn jest answer), to conversion (patrz spec).
Patrz „How expensive is []byte(string)?” (reverse problem, ale sam wniosek zastosowanie) gdzie zzzz wymienić:

Niektóre konwersje są takie same jak gipsie, jak uint(myIntvar), który właśnie na nowo interpretuje bity w miejscu.

Sonia dodaje:

Making ciąg z plasterkiem bajtów, na pewno wymaga przydzielania ciąg na stercie. Właściwość immutability to wymusza.
Czasami można zoptymalizować, wykonując jak najwięcej pracy za pomocą bajtu [], a następnie tworząc ciąg na końcu. Typ bytes.Buffer jest często przydatny.

+0

Dzięki. Czy masz jakieś sugestie, w jaki sposób mógłbym to ustalić na własną rękę? Jak to robi string()? Dlaczego nie widzę tego z reflect.TypeOf? –

+1

@TiborSzasz Jest to prosta konwersja: zobacz https://blog.golang.org/slices#TOC_12. – VonC

+0

@TiborSzasz Podczas konwersji: https://golang.org/ref/spec#Conversions – VonC

4

Sposób używasz, aby przeczytać odpowiedź ciała http zwraca kawałek bajtów:

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

official documentation

można przekonwertować []byte do łańcucha za pomocą

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

Dzięki za odpowiedź! –

1

string (byteslice) zamieni wycinek bajtu na string, po prostu wiedz, że to nie tylko konwersja typu, b także kopię pamięci.