Akses respons HTTP sebagai string di Go

123

Saya ingin mengurai respons permintaan web, tetapi saya mengalami masalah saat mengaksesnya sebagai string.

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

Bagaimana saya bisa mengakses respon sebagai string? ioutil.WriteFilemenulis dengan benar respons ke file.

Saya sudah memeriksa referensi paket tetapi tidak terlalu membantu.

Tibor Szasz
sumber

Jawaban:

221

bs := string(body) seharusnya cukup untuk memberi Anda tali.

Dari sana, Anda bisa menggunakannya sebagai string biasa.

Sedikit seperti di utas ini :

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

Lihat juga GoByExample .

Seperti komentar di bawah ini (dan di ZZN 's jawaban ), ini adalah konversi (lihat spesifikasi ).
Lihat " Seberapa mahal []byte(string)? " (Masalah sebaliknya, tetapi kesimpulan yang sama berlaku) di mana zzzz menyebutkan:

Beberapa konversi sama dengan cast, seperti uint(myIntvar), yang hanya menafsirkan ulang bit pada tempatnya.

Sonia menambahkan:

Membuat string dari potongan byte, pasti melibatkan pengalokasian string pada heap. Properti kekekalan memaksa ini.
Terkadang Anda bisa mengoptimalkan dengan melakukan pekerjaan sebanyak mungkin dengan [] byte dan kemudian membuat string di akhir. The bytes.Buffertipe ini sering berguna.

VonC
sumber
Terima kasih. Apakah Anda punya saran bagaimana saya bisa mengetahuinya sendiri? Bagaimana string () melakukan itu? Mengapa saya tidak dapat melihatnya dengan reflect.TypeOf?
Tibor Szasz
1
@TiborSzasz Ini adalah konversi sederhana: lihat blog.golang.org/slices#TOC_12 .
VonC
Peningkatan kecil pada kode Anda akan digunakan http.StatusOKsebagai pengganti nilai mentah 200!
Shadoninja
Saya telah melakukan ini dan menemukan bahwa badan permintaan saya selalu memiliki karakter baris baru di akhir. Apakah ini normal untuk badan permintaan atau yang disebabkan oleh ioutil.ReadAll()??
sixty4bit
29

Metode yang Anda gunakan untuk membaca respons tubuh http mengembalikan potongan byte:

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

dokumentasi resmi

Anda dapat mengonversi []bytemenjadi string dengan menggunakan

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

string (byteslice) akan mengubah potongan byte menjadi string, ketahuilah bahwa ini tidak hanya konversi tipe saja, tetapi juga salinan memori.

zzn
sumber