Go তে স্ট্রিং হিসাবে 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)? " (বিপরীত সমস্যা, তবে একই উপসংহার প্রযোজ্য) যেখানে জেডজেজ উল্লেখ করেছেন:

কিছু রূপান্তর কাস্টের মতো uint(myIntvar), যা ঠিক জায়গায় জায়গায় বিটকে নতুন করে ব্যাখ্যা করে।

সোনিয়া যোগ করেছেন:

বাইট স্লাইস থেকে স্ট্রিং তৈরি করা অবশ্যই গাদাতে স্ট্রিং বরাদ্দ করে। অপরিবর্তনযোগ্যতা সম্পত্তি এটিকে বাধ্য করে।
কখনও কখনও আপনি [] বাইট দিয়ে যতটা সম্ভব কাজ করে এবং তারপরে শেষে স্ট্রিং তৈরি করে অনুকূলিত করতে পারেন। bytes.Bufferটাইপ প্রায়ই দরকারী।


ধন্যবাদ। আপনার নিজের কোনও পরামর্শ আছে কীভাবে আমি নিজে থেকে এটি বের করে আনতে পারি? স্ট্রিং () এটি কীভাবে করে? আমি কেন এটি প্রতিবিম্বের সাথে দেখতে পাচ্ছি না? টাইপঅফ?
টিবোর জাজস

1
@ টিবোরসাজস এটি একটি সাধারণ রূপান্তর: দেখুন Blog.golang.org/slices#TOC_12
ভোনসি

আপনার কোডে একটি ছোট উন্নতি হবে http.StatusOKকাঁচা 200মানের পরিবর্তে ব্যবহার করা !
শাদোনিনিজা

আমি এটি করছি এবং সন্ধান করেছি যে আমার অনুরোধ সংস্থাগুলির সর্বদা শেষে একটি নতুন লাইনের চর থাকে। একটি অনুরোধ বডি জন্য এটি সাধারণ বা এটি দ্বারা সাবধান করা হয় ioutil.ReadAll()??
ষোলটিবিট

29

আপনি পোষ্টের শরীরে প্রতিক্রিয়া পড়তে যে পদ্ধতিটি ব্যবহার করছেন তা একটি বাইট স্লাইস দেয়:

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

অফিসিয়াল ডকুমেন্টেশন

আপনি []byteব্যবহার করে একটি স্ট্রিং রূপান্তর করতে পারেন

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

1

স্ট্রিং (বাইটস্লাইস) বাইট স্লাইসকে স্ট্রিংয়ে রূপান্তরিত করবে, কেবলমাত্র জেনে রাখুন এটি কেবল রূপান্তর টাইপ করে না, মেমরির অনুলিপিও দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.