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.

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.


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)

1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.