เข้าถึงการตอบสนอง HTTP เป็นสตริงใน Go


125

ฉันต้องการแยกวิเคราะห์การตอบสนองของคำขอทางเว็บ แต่ฉันประสบปัญหาในการเข้าถึงเป็นสตริง

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

ฉันจะเข้าถึงการตอบกลับเป็นสตริงได้อย่างไร ioutil.WriteFileเขียนการตอบสนองไปยังไฟล์อย่างถูกต้อง

ฉันได้ตรวจสอบการอ้างอิงแพ็คเกจแล้ว แต่ไม่เป็นประโยชน์

คำตอบ:


223

bs := string(body) ควรจะเพียงพอที่จะให้คุณสตริง

จากนั้นคุณสามารถใช้เป็นสตริงปกติได้

เล็กน้อยในหัวข้อนี้ :

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

ดูGoByExampleด้วย

ตามความคิดเห็นด้านล่าง (และในคำตอบของzzn ) นี่คือการแปลง (ดูข้อมูลจำเพาะ ) ดู " แพงแค่ไหน " (ปัญหาย้อนกลับ แต่ใช้ข้อสรุปเดียวกัน) ที่zzzzกล่าวถึง:
[]byte(string)

การแปลงบางอย่างเหมือนกับการแคสต์เช่นuint(myIntvar)ซึ่งแปลความหมายของบิตในตำแหน่งใหม่

Soniaเพิ่ม:

การสร้างสตริงจากชิ้นส่วนไบต์นั้นเกี่ยวข้องกับการจัดสรรสตริงบนฮีป คุณสมบัติไม่เปลี่ยนรูปบังคับให้สิ่งนี้
บางครั้งคุณสามารถเพิ่มประสิทธิภาพโดยทำงานให้มากที่สุดด้วย [] ไบต์จากนั้นสร้างสตริงในตอนท้าย bytes.Bufferประเภทมักจะเป็นประโยชน์


ขอบคุณ คุณมีข้อเสนอแนะว่าฉันจะคิดออกด้วยตัวเองได้อย่างไร? string () ทำได้อย่างไร? ทำไมมองไม่เห็นด้วย reflect.TypeOf?
Tibor Szasz

1
@TiborSzasz มันเป็นแปลงที่เรียบง่ายดูblog.golang.org/slices#TOC_12
VonC

การปรับปรุงโค้ดของคุณเล็กน้อยคือการใช้http.StatusOKแทน200ค่าดิบ!
Shadoninja

ฉันได้ทำสิ่งนี้แล้วและพบว่าหน่วยงานคำขอของฉันมักจะมีอักขระขึ้นบรรทัดใหม่อยู่ท้าย นี่เป็นเรื่องปกติสำหรับร่างกายที่ร้องขอหรือเป็นที่ cauased โดยioutil.ReadAll()??
sixty4bit

30

วิธีที่คุณใช้เพื่ออ่านการตอบสนองของเนื้อหา http จะส่งกลับชิ้นส่วนไบต์:

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

เอกสารอย่างเป็นทางการ

คุณสามารถแปลง[]byteเป็นสตริงโดยใช้ไฟล์

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

1

สตริง (byteslice) จะแปลงชิ้นส่วนไบต์เป็นสตริงเพียงแค่รู้ว่าไม่ใช่แค่พิมพ์การแปลงเท่านั้น แต่ยังรวมถึงสำเนาหน่วยความจำด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.