2016-07-30 17 views
34

Tôi muốn phân tích cú pháp phản hồi của yêu cầu web, nhưng tôi gặp sự cố khi truy cập chuỗi dưới dạng chuỗi.Truy cập phản hồi HTTP dưới dạng chuỗi trong 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") 
} 

Tôi làm cách nào để truy cập phản hồi dưới dạng chuỗi? ioutil.WriteFile ghi chính xác phản hồi cho tệp.

Tôi đã kiểm tra tham chiếu gói nhưng nó không thực sự hữu ích.

Trả lời

53

bs := string(body) là đủ để cung cấp cho bạn chuỗi.

Từ đó, bạn có thể sử dụng nó làm chuỗi thông thường.

Một chút như 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) 
} 

Xem thêm GoByExample.

Như nhận xét dưới đây (và trong zzn 's answer), đây là một conversion (xem spec).
Xem "How expensive is []byte(string)?" (đảo ngược vấn đề, nhưng kết luận tương tự áp dụng), nơi zzzz đề cập:

Một số chuyển đổi cũng giống như một dàn diễn viên, như uint(myIntvar), mà chỉ giải thích lại các bit tại chỗ.

Sonia cho biết thêm:

Làm một chuỗi ra khỏi một lát byte, chắc chắn liên quan đến việc phân bổ các chuỗi trên heap. Bất động sản bất động sản này.
Đôi khi bạn có thể tối ưu hóa bằng cách thực hiện càng nhiều công việc càng tốt với byte [] và sau đó tạo chuỗi ở cuối. Loại bytes.Buffer thường hữu ích.

+0

Cảm ơn. Bạn có bất cứ đề nghị làm thế nào tôi có thể tự tìm ra nó? String() làm như thế nào? Tại sao tôi không thể nhìn thấy nó với reflect.TypeOf? –

+1

@TiborSzasz Đây là một chuyển đổi đơn giản: xem https://blog.golang.org/slices#TOC_12. – VonC

+0

@TiborSzasz Khi chuyển đổi: https://golang.org/ref/spec#Conversions – VonC

4

Phương pháp bạn đang sử dụng để đọc các phản ứng cơ thể http trả về một lát byte:

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

official documentation

Bạn có thể chuyển đổi []byte thành một chuỗi bằng cách sử dụng

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

Cảm ơn bạn đã trả lời! –

1

chuỗi (bytelice) sẽ chuyển đổi byte slice thành chuỗi, chỉ cần biết rằng nó không chỉ đơn giản là loại chuyển đổi, b ut cũng có bản sao bộ nhớ.

Các vấn đề liên quan