একটি জিইটি অনুরোধ করে কোয়েরিস্ট্রিং তৈরি করুন


90

আমি গোতে বেশ নতুন এবং এখনও পুরোপুরি বুঝতে পারছি না। নোড.জেএস, কৌণিক, জিউকিউরি, পিএইচপি আধুনিক অনেক ভাষাতে আপনি অতিরিক্ত ক্যোয়ারিং স্ট্রিং পরামিতিগুলির সাথে জিইটি অনুরোধ করতে পারেন।

গো তে এটি করা যেমন সহজ মনে হয় তেমন সহজ নয় এবং আমি এখনও এটি নির্ধারণ করতে পারি না। আমি করতে চাই এমন প্রতিটি অনুরোধের জন্য সত্যই আমি একটি স্ট্রিং যুক্ত করতে চাই না।

এখানে নমুনা স্ক্রিপ্ট:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    client := &http.Client{}

    req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    req.Header.Add("Accept", "application/json")
    resp, err := client.Do(req)

    if err != nil {
        fmt.Println("Errored when sending request to the server")
        return
    }

    defer resp.Body.Close()
    resp_body, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(resp.Status)
    fmt.Println(string(resp_body))
}

এই উদাহরণে আপনি দেখতে পাচ্ছেন যে একটি URL আছে, যার মান হিসাবে আপনার এপিআই কী সহ api_key এর একটি জিইটি ভেরিয়েবল দরকার। এটি হ'ল সমস্যাটি হ'ল আকারে কোডেড হয়ে উঠেছে:

req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey", nil)

এই ক্যোয়ারী স্ট্রিংটি গতিশীলভাবে তৈরি করার কোনও উপায় আছে কি ?? বৈধ প্রতিক্রিয়া পেতে এই মুহুর্তে আমার এই পদক্ষেপের আগে ইউআরএল একত্রিত করতে হবে।


4
সুতরাং একটি স্ট্রিং সংক্ষেপে ভুল কি?
সালভাদোর ডালি

4
আমি মনে করি কিছুই না, তবে এটি সত্যিই মার্জিত একাকীকরণ নয়, কেবল ভেবেছিলেন যে গোতে কাজ করার আরও ভাল উপায় আছে। আপনি ক্রিয়া পরিবর্তনগুলি, পদ্ধতিটি দেখুন এবং তারপরে আপনাকে সমস্ত কিছু একসাথে স্ট্রিং করতে হবে।
রুডি স্ট্রিডম

4
আপনি url.Valuesএর Encodeপদ্ধতি ব্যবহার করতে পারেন । আপনি URL.Stringসম্পূর্ণ ইউআরএল তৈরি করতে ব্যবহার করতে পারেন ।
ডেভ সি

উত্তর:


213

একজন মন্তব্যকারী হিসাবে উল্লেখ হিসাবে আপনি একটি পদ্ধতি আছে যা Valuesথেকে পেতে পারেন । আপনি এর মতো কিছু করতে পারেন ( বিদ্যমানটি ফিরিয়ে দেন )net/urlEncodereq.URL.Query()url.Values

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    req, err := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")
    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popular?another_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

http://play.golang.org/p/L5XCrw9VIG


4
অসাধারণ আপনাকে ধন্যবাদ মানুষ! ঠিক আমি যা খুঁজছিলাম!
রুডি স্ট্রিডম

পরীক্ষার জন্যও দুর্দান্ত!
কাইল চদা

আপনার চাওয়া ক্রমে ক্যোরি স্ট্রিং প্যারামিটারগুলি তৈরি করার কোনও সমাধান? কীগুলি Encode()পদ্ধতিতে বাছাই করা হয় ।
আর্টিফেরপি

4
@ এরিটিফেরপি যদি কোনও কারণে সমালোচিত হয় তবে এনকোড পদ্ধতিতে তারা কী করছে তা আপনি পুনরায় প্রয়োগ করতে পারেন golang.org/src/net/url/url.go?s=24222:24253#L845 তবে কেন আমি এর চেয়ে বেশি গুরুত্বপূর্ণ তা ভাবতে পারি।
jcbwlkr

4
আপনি যদি এটি দিয়ে কিছু না করে থাকেন তবে আপনাকে নিউ রিকোয়েস্ট ব্যবহার করার দরকার নেই। আপনি কেবল url.Parse("https://something.com/")পরিবর্তে ব্যবহার করতে পারেন বা সরাসরি কোনও ইউআরএল অবজেক্ট তৈরি করতে পারেন ।
রিচার্ড

36

ব্যবহার করুন r.URL.Query()যখন আপনি যদি বিদ্যমান প্রশ্নের সংযোজন, যদি আপনি প্যারাম নতুন সেট নির্মাণ করা হয় ব্যবহার url.Valuesতাই মত struct হয়

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "os"
)

func main() {
    req, err := http.NewRequest("GET","http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    // if you appending to existing query this works fine 
    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    // or you can create new url.Values struct and encode that like so
    q := url.Values{}
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popularanother_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

14

NewRequestশুধু একটি URL তৈরি করতে ব্যবহার করা একটি ওভারকিল। net/urlপ্যাকেজটি ব্যবহার করুন :

package main

import (
    "fmt"
    "net/url"
)

func main() {
    base, err := url.Parse("http://www.example.com")
    if err != nil {
        return
    }

    // Path params
    base.Path += "this will get automatically encoded"

    // Query params
    params := url.Values{}
    params.Add("q", "this will get encoded as well")
    base.RawQuery = params.Encode() 

    fmt.Printf("Encoded URL is %q\n", base.String())
}

খেলার মাঠ: https://play.golang.org/p/YCTvdluws-r


রাজি, দুর্দান্ত উত্তর!
Pow-il

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