Go'da dize olarak HTTP yanıtına erişin


125

Bir web isteğinin yanıtını ayrıştırmak istiyorum, ancak ona dize olarak erişirken sorun yaşıyorum.

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

Yanıta string olarak nasıl erişebilirim? ioutil.WriteFileyanıtı bir dosyaya doğru yazar.

Paket referansını zaten kontrol ettim ama gerçekten yardımcı olmadı.

Yanıtlar:


223

bs := string(body) size bir ip vermek için yeterli olmalıdır.

Oradan, onu normal bir dize olarak kullanabilirsiniz.

Bu konu başlığındaki gibi biraz :

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

Ayrıca bkz . GoByExample .

(Ve aşağıda yorumladığı gibi zzn 'ın cevabı ), bu bir dönüşüm (bkz Spec ). Zzzz'in bahsettiği
" Ne kadar pahalı []byte(string)? " Bölümüne bakın (tersi sorun, ancak aynı sonuç geçerlidir) :

Bazı dönüşümler uint(myIntvar), bitleri yerinde yeniden yorumlayan bir döküm ile aynıdır .

Sonia ekliyor:

Bir bayt diliminden bir dize oluşturmak, kesinlikle dizeyi öbek üzerinde tahsis etmeyi içerir. Değişmezlik özelliği bunu zorlar.
Bazen [] bayt ile olabildiğince çok çalışarak ve sonunda bir dizi oluşturarak optimizasyon yapabilirsiniz. bytes.BufferTipi genellikle yararlıdır.


Teşekkürler. Bunu kendi başıma nasıl çözebileceğim konusunda herhangi bir öneriniz var mı? String () bunu nasıl yapar? Reflektöre göre neden göremiyorum.TypeOf?
Tibor Szasz

1
@TiborSzasz Bu basit bir dönüşümdür: bkz. Blog.golang.org/slices#TOC_12 .
VonC

Kodunuzda küçük bir iyileştirme http.StatusOK, ham 200değer yerine kullanmak olacaktır !
Shadoninja

Bunu yapıyorum ve istek bedenlerimin sonunda her zaman bir satırsonu karakteri olduğunu görüyorum. Bu bir istek gövdesi için normal midir, yoksa tarafından mı belirlenir ioutil.ReadAll()?
altmış4bit

30

Http gövde yanıtını okumak için kullandığınız yöntem bir bayt dilimi döndürür:

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

resmi belgeler

[]byteKullanarak bir dizeye dönüştürebilirsiniz

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

1

string (byteslice) bayt dilimini dizgeye dönüştürecektir, sadece bunun sadece tür dönüşümü değil, aynı zamanda bellek kopyası olduğunu bilin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.