গো এর এইচটিসি প্যাকেজে, কীভাবে আমি একটি পোস্টের অনুরোধে ক্যোরিয় স্ট্রিং পেতে পারি?


113

httpপোস্টের অনুরোধটি মোকাবেলায় আমি গো থেকে প্যাকেজটি ব্যবহার করছি । কীভাবে আমি Requestঅবজেক্ট থেকে ক্যোরিয় স্ট্রিংয়ের সামগ্রী অ্যাক্সেস এবং পার্স করতে পারি ? সরকারী নথি থেকে উত্তর খুঁজে পাচ্ছি না find


একটি বিষয় মনে রাখবেন, আপনি যদি অনুরোধগুলি প্রেরণের জন্য সিআরএল ব্যবহার করেন এবং আপনি r.FormValue("id")কোয়েরি পরম আনার জন্য ব্যবহার করেন তবে আপনি সিআরএল-এ ফর্ম ডেটার মাধ্যমে আমাকে প্রেরণ করতে পারবেন না (যেমন, curl 0.0.0.0:8888 -d id=foobarকাজ করবে না)। আপনাকে অবশ্যই এটি ক্যোয়ারী প্যারামের মাধ্যমে প্রেরণ করতে হবে ( curl 0.0.0.0:8888?id=foobar)।

উত্তর:


144

একজন QueryString হয় সংজ্ঞা দ্বারা URL- এ। আপনি অনুরোধটির ইউআরএল req.URL( ডক ) ব্যবহার করে অ্যাক্সেস করতে পারেন । ইউআরএল অবজেক্টে একটি Query()পদ্ধতি ( ডক ) রয়েছে যা একটি Valuesটাইপ প্রদান করে, যা কেবল map[string][]stringকোয়েরিস্ট্রিং পরামিতিগুলির মধ্যে একটি।

আপনি যদি সন্ধান করছেন তা যদি কোনও এইচটিএমএল ফর্ম দ্বারা জমা দেওয়া পোস্টের ডেটা হয় , তবে এটি (সাধারণত) অনুরোধের বডিটিতে একটি মূল-মান জুড়ি। আপনি নিজের উত্তরে সঠিক আছেন যে আপনি কল করতে পারেন ParseForm()এবং তারপরে req.Formকী-মান জোড়ার জোড়ার মানচিত্র পেতে ক্ষেত্রটি ব্যবহার করতে পারেন, তবে আপনি FormValue(key)একটি নির্দিষ্ট কীটির মান পেতে কল করতে পারেন। ParseForm()প্রয়োজনে এটি কল করে এবং সেগুলি কীভাবে প্রেরণ করা হয়েছিল তা নির্বিশেষে মানগুলি পায় (যেমন ক্যোয়ারী স্ট্রিংয়ে বা অনুরোধের অংশে)।


2
স্পষ্টতা জন্য ধন্যবাদ।
ফাবিয়েন

2
আমি 'রেকর্ড.ফর্মভ্যালু (কী)' পদ্ধতিটি আরও দ্রুত খুঁজে পেয়েছি এবং ইউআরএল পার্স করার জন্য আপনার প্রয়োজনীয় সমস্ত কোড করব।

6
req.URL.RawQuery?জিইটি অনুরোধে সমস্ত কিছু ফেরত দেয় , যদি এটি সহায়তা করে।
কৌটন

আমি এটি আকর্ষণীয় দেখেছি। Rek.forValue ("কিছু_ফিল্ড") একবার ইজারাতে না নিলে ফর্মটি শূন্য অ্যারে হয়।
কিয়ান চেন

অসংখ্য ধন্যবাদ! @কাউটন
আদিত্য ভার্মা

127

জিইটি প্যারামিটারগুলি কীভাবে অ্যাক্সেস করবেন তার আরও দৃ concrete় উদাহরণ এখানে। Requestবস্তুর একটি পদ্ধতি যে তাদের জন্য আপনাকে নামক আউট parses হয়েছে ক্যোয়ারী :

একটি অনুরোধ URL যেমন http: // হোস্ট: পোর্ট / কিছু? প্যারাম 1 = বি হিসাবে ধরে নিচ্ছেন

func newHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println("GET params were:", r.URL.Query())

  // if only one expected
  param1 := r.URL.Query().Get("param1")
  if param1 != "" {
    // ... process it, will be the first (only) if multiple were given
    // note: if they pass in like ?param1=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=something
  param1s := r.URL.Query()["param1"]
  if len(param1s) > 0 {
    // ... process them ... or you could just iterate over them without a check
    // this way you can also tell if they passed in the parameter as the empty string
    // it will be an element of the array that is the empty string
  }    
}

এছাড়াও নোট করুন "একটি মান মানচিত্রের কীগুলি [যেমন প্রশ্নের () ফেরতের মান] কেস সংবেদনশীল।"


4
একটি পূর্ববর্তী উত্তর ইতিমধ্যে উল্লেখ করছেন ঠিক যে এর ডক্স লিঙ্ক (এবং একটি উদাহরণ যে সীমার একটি আউট প্যানিক হবে নেই রেফারেন্স যেভাবেই ইচ্ছা হলে ক্ষেত্র উপস্থিত নেই, ব্যবহার r.URL.Query().Get("moviename")এই মারাত্মক ভুল এড়ানোর জন্য)।
ডেভ সি

1
তথ্যের জন্য ধন্যবাদ। হ্যাঁ, ডক্সটি আমার জন্য কিছুটা বিভ্রান্তিকর, তাই দরকারী হিসাবে ক্ষেত্রে এটিকে আমি "উদাহরণস্বরূপ হাত" হিসাবে পোস্ট করেছি। নিল চেক স্থির। Getএকাধিক থাকলে কেবল পদ্ধতিটি ব্যবহার করে প্রথমটি ফিরে আসে, তাই এটি আরও উদাহরণ। দরকারী তথ্য, আপনাকে ধন্যবাদ!
রজারডপ্যাক

এছাড়াও আমি মনে করি না আপনি একটি স্ট্রিংকে শূন্যের সাথে তুলনা করতে পারবেন: devs.cloudimmune.com/gotchas-and-common-mistakes-in-go-golang অর্থাত্ স্ট্রিং! = "" বৈধ
জেমস মিলনার

আমি মনে করি না যে কোডটি সংকলন করবে, উদাহরণটি সম্পূর্ণ ছিল। আপনি খালি স্ট্রিং যে তুলনা করতে পারবেন না Values.Get()আয় সঙ্গে nilgolang.org/pkg/net/url/#Values
ড্যানিয়েল ফারেল

19

নীচে একটি উদাহরণ দেওয়া হল:

value := r.FormValue("field")

আরও তথ্যের জন্য. HTTP প্যাকেজ সম্পর্কে, আপনি এটির ডকুমেন্টেশন এখানে দেখতে পারেনFormValueমূলত POST বা PUT মানগুলি বা GET মানগুলি প্রদান করে, সেই ক্রমে, এটি প্রথমটি খুঁজে পায়।


8

এখানে একটি সাধারণ, কার্যকারী উদাহরণ:

package main

import (
    "io"
    "net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "name: "+req.FormValue("name"))
    io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}

func main() {
    http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
        queryParamDisplayHandler(res, req)
    })
    println("Enter this in your browser:  http://localhost:8080/example?name=jenny&phone=867-5309")
    http.ListenAndServe(":8080", nil)
}

এখানে চিত্র বর্ণনা লিখুন


6

ক্যোয়ারী প্যারামগুলি পাওয়ার দুটি উপায় রয়েছে:

  1. Reqeust.URL.Query () ব্যবহার করে
  2. অনুরোধ.ফর্ম

দ্বিতীয় ক্ষেত্রে কাউকে সতর্কতা অবলম্বন করতে হবে কারণ শরীরের পরামিতিগুলি ক্যোয়ারী প্যারামিটারগুলির চেয়ে বেশি হবে। ক্যোয়ারী প্যারামগুলি পাওয়ার সম্পর্কে একটি সম্পূর্ণ বিবরণ এখানে পাওয়া যাবে

https://golangbyexample.com/net-http-package-get-query-params-golang


5

নীচে শব্দগুলি অফিসিয়াল ডকুমেন্ট থেকে এসেছে।

ফর্মটিতে ইউআরএল ফিল্ডের ক্যোয়ারী প্যারামিটার এবং পিওএসটি বা পুট ফর্ম ডেটা উভয়ই বিশ্লেষণ করা ফর্ম ডেটা রয়েছে । এই ক্ষেত্রটি কেবল পার্সফর্ম কল করার পরে উপলব্ধ।

সুতরাং, নীচের হিসাবে নমুনা কোড কাজ করবে।

func parseRequest(req *http.Request) error {
    var err error

    if err = req.ParseForm(); err != nil {
        log.Error("Error parsing form: %s", err)
        return err
    }

    _ = req.Form.Get("xxx")

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