गो में स्ट्रिंग के रूप में HTTP प्रतिक्रिया को एक्सेस करें


123

मैं एक वेब अनुरोध की प्रतिक्रिया को पार्स करना चाहता हूं, लेकिन मुझे इसे स्ट्रिंग के रूप में एक्सेस करने में परेशानी हो रही है।

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किसी फ़ाइल की प्रतिक्रिया को सही ढंग से लिखता है।

मैंने पहले ही पैकेज संदर्भ की जाँच कर ली है लेकिन यह वास्तव में मददगार नहीं है।

जवाबों:


221

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 के उत्तर में ), यह रूपांतरण है ( कल्पना देखें )।
देखें " कितना महंगा है []byte(string)? " (रिवर्स समस्या, लेकिन एक ही निष्कर्ष लागू होता है) जहां zzzz का उल्लेख किया गया है:

कुछ रूपांतरण एक कास्ट के समान होते हैं, जैसे uint(myIntvar), जो कि बिट्स को जगह में बदल देते हैं।

सोनिया ने कहा:

एक बाइट स्लाइस से एक स्ट्रिंग बनाना, निश्चित रूप से ढेर पर स्ट्रिंग आवंटित करना शामिल है। अपरिवर्तनीय संपत्ति इसे मजबूर करती है।
कभी-कभी आप [] बाइट के साथ जितना संभव हो उतना काम करके अनुकूलन कर सकते हैं और फिर अंत में एक स्ट्रिंग बना सकते हैं। bytes.Bufferप्रकार अक्सर उपयोगी है।


धन्यवाद। क्या आपके पास कोई सुझाव है कि मैं इसे अपने दम पर कैसे समझ सकता हूं? स्ट्रिंग () कैसे करता है? मैं इसे प्रतिबिंबित के साथ क्यों नहीं देख सकता।
टिबोर एससज़ जूल

1
@TiborSzasz यह एक साधारण रूपांतरण है: blog.golang.org/slices#TOC_12 देखें ।
वॉनसी

आपके कोड में एक छोटा सा सुधार http.StatusOKकच्चे 200मूल्य के बजाय उपयोग करना होगा !
शादिनिजा

मैं यह कर रहा हूं और पा रहा हूं कि मेरे अनुरोध निकायों में हमेशा एक नयालाइन चार्ट होता है। क्या यह एक अनुरोध निकाय के लिए सामान्य है या उस द्वारा काऊडेड है ioutil.ReadAll()??
साठ4bit

29

Http बॉडी रिस्पांस पढ़ने के लिए आप जिस विधि का उपयोग कर रहे हैं वह बाइट स्लाइस देता है:

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

आधिकारिक दस्तावेज

आप []byteउपयोग करके स्ट्रिंग में परिवर्तित कर सकते हैं

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

1

स्ट्रिंग (बाइट्सलिस) बाइट स्लाइस को स्ट्रिंग में बदल देगा, बस यह जान लें कि यह न केवल टाइप रूपांतरण है, बल्कि मेमोरी कॉपी भी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.