`Http.NewRequest (…) using ব্যবহার করে একটি URL- এনকোডেড পোষ্ট অনুরোধ করুন`


98

আমি কোনও application/x-www-form-urlencodedসামগ্রীর ধরণ হিসাবে আমার ডেটা প্রেরণ করে এমন কোনও এপিআইতে একটি পোষ্ট অনুরোধ করতে চাই । আমার অনুরোধ শিরোনামগুলি পরিচালনা করতে হবে এই কারণে, আমি http.NewRequest(method, urlStr string, body io.Reader)একটি অনুরোধ তৈরি করতে পদ্ধতিটি ব্যবহার করছি । এই পোস্টের অনুরোধের জন্য আমি আমার ডেটা ক্যোয়ারীটি ইউআরএলে সংযুক্ত করি এবং শরীরটি খালি রাখি, এরকম কিছু:

package main

import (
    "bytes"
    "fmt"
    "net/http"
    "net/url"
    "strconv"
)

func main() {
    apiUrl := "https://api.com"
    resource := "/user/"
    data := url.Values{}
    data.Set("name", "foo")
    data.Add("surname", "bar")

    u, _ := url.ParseRequestURI(apiUrl)
    u.Path = resource
    u.RawQuery = data.Encode()
    urlStr := fmt.Sprintf("%v", u) // "https://api.com/user/?name=foo&surname=bar"

    client := &http.Client{}
    r, _ := http.NewRequest("POST", urlStr, nil)
    r.Header.Add("Authorization", "auth_token=\"XXXXXXX\"")
    r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    r.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))

    resp, _ := client.Do(r)
    fmt.Println(resp.Status)
}

আমি প্রতিক্রিয়া হিসাবে, আমি সবসময় একটি পেতে 400 BAD REQUEST। আমি বিশ্বাস করি যে সমস্যাটি আমার অনুরোধের উপর নির্ভর করে এবং এপিআই বুঝতে পারে না আমি কোন পেওড পোস্ট করছি। আমি এই জাতীয় পদ্ধতি সম্পর্কে সচেতন, Request.ParseFormযদিও এই প্রসঙ্গে এটি কীভাবে ব্যবহার করা যায় তা নিশ্চিত নয়। আমি কি আরও কিছু শিরোনাম অনুভব করছি, প্যারামিটারটি application/jsonব্যবহার করে bodyপেডলোড প্রকার হিসাবে প্রেরণের আরও ভাল কোনও উপায় আছে কি?

উত্তর:


189

ইউআরএল-এনকোডেড পেডলোডটি অবশ্যই bodyপ্যারামিটারে প্রদান করা আবশ্যক http.NewRequest(method, urlStr string, body io.Reader), একটি ধরণের যা io.Readerইন্টারফেস প্রয়োগ করে ।

নমুনা কোডের ভিত্তিতে:

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "strconv"
    "strings"
)

func main() {
    apiUrl := "https://api.com"
    resource := "/user/"
    data := url.Values{}
    data.Set("name", "foo")
    data.Set("surname", "bar")

    u, _ := url.ParseRequestURI(apiUrl)
    u.Path = resource
    urlStr := u.String() // "https://api.com/user/"

    client := &http.Client{}
    r, _ := http.NewRequest(http.MethodPost, urlStr, strings.NewReader(data.Encode())) // URL-encoded payload
    r.Header.Add("Authorization", "auth_token=\"XXXXXXX\"")
    r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    r.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))

    resp, _ := client.Do(r)
    fmt.Println(resp.Status)
}

resp.Statusহয় 200 OKএই ভাবে।


4
আমি যদি কোনও ডেটা প্রেরণ করতে চাই না তবে কি ?? আমি যদি `বাইটস.নিউবুফারস্ট্রিং (ডেটা.এনকোড ()) place এর জায়গায় কোনও ডামি ডেটা প্রেরণ করি তবে এটি কী কাজ করবে?
আদিত্য পেশায়েভ

উদাহরণ: আমি একটি খালি * বাফার পাঠাতে চেষ্টা চাই bদেওয়াvar b bytes.Buffer
ফার্নান্দো ক।

4
আপনার Content-Lenghtযেমন শিরোনাম সেট করার দরকার নেইhttp.NewRequest নেই।
ডিভিডিপিএলএম

12
আমি মনে করি strings.NewReader(data.Encode())পরিবর্তে আমরা (আরও দক্ষ) ব্যবহার করতে পারি bytes.NewBufferString(data.Encode())। এ func NewReader (গুলি স্ট্রিং) * রিডার , এটা বলে "NewReader একটি নতুন রিডার s থেকে পড়া ফেরৎ। এটা bytes.NewBufferString অনুরূপ কিন্তু দক্ষ ও শুধুমাত্র পাঠযোগ্য হয়।"
লিয়াং চেন

4
data.Setপরিবর্তে, উভয় nameএবং জন্য ব্যবহার করা উচিত । এটি একই কীতে অন্য মান যুক্ত করার পরিবর্তে কীটির মান নির্ধারণ করে। খুব কাজ করে, তবে খালি টুকরো অপ্রয়োজনীয় করে। surnamedata.Adddata.AddAddappend(v[key], value)
ধাতব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.