Truy cập phản hồi HTTP dưới dạng chuỗi trong Go


123

Tôi muốn phân tích cú pháp phản hồi của một yêu cầu web, nhưng tôi gặp sự cố khi truy cập nó dưới dạng chuỗi.

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

Làm cách nào để truy cập phản hồi dưới dạng chuỗi? ioutil.WriteFileghi chính xác phản hồi vào một tệp.

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

Câu trả lời:


221

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

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

Một chút như trong chủ đề này :

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

Xem thêm GoByExample .

Như nhận xét bên dưới (và trong câu trả lời của zzn ), đây là một chuyển đổi (xem thông số kỹ thuật ). Xem " Đắt thế nào ? " (Vấn đề ngược lại, nhưng áp dụng cùng một kết luận) trong đó zzzz đã đề cập:
[]byte(string)

Một số chuyển đổi giống như một phép truyền, chẳng hạn như uint(myIntvar), chỉ diễn giải lại các bit tại chỗ.

Sonia cho biết thêm:

Tạo một chuỗi từ một lát byte, chắc chắn liên quan đến việc phân bổ chuỗi trên heap. Tính chất bất biến buộc điều này.
Đôi khi bạn có thể tối ưu hóa bằng cách thực hiện nhiều công việc nhất có thể với byte [] và sau đó tạo một chuỗi ở cuối. Các bytes.Bufferloại thường hữu ích.


Cảm ơn. Bạn có bất kỳ đề nghị nào làm thế nào tôi có thể tìm ra nó một mình? Làm thế nào để chuỗi () làm điều đó? Tại sao tôi không thể nhìn thấy nó bằng phản xạ.TypeOf?
Tibor Szasz,

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

Một cải tiến nhỏ đối với mã của bạn là sử dụng http.StatusOKthay vì 200giá trị thô !
Shadoninja

Tôi đã làm điều này và nhận thấy rằng các phần thân yêu cầu của tôi luôn có ký tự dòng mới ở cuối. Đây có phải là điều bình thường đối với một phần thân yêu cầu hay điều đó bị làm khó bởi ioutil.ReadAll()??
sixty4bit

29

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

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

tài liệu chính thức

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

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

1

string (byteslice) 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à chuyển đổi kiểu mà còn sao chép bộ nhớ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.