আমি কীভাবে কোনও পোষ্ট অনুরোধে জেএসএন স্ট্রিং প্রেরণ করব


244

আমি এপিয়ারির সাথে কাজ করার চেষ্টা করেছি এবং মক সার্ভারে JSON প্রেরণ এবং এই কোডটি রাখতে একটি সর্বজনীন টেম্পলেট তৈরি করেছি:

package main

import (
    "encoding/json"
    "fmt"
    "github.com/jmcvetta/napping"
    "log"
    "net/http"
)

func main() {
    url := "http://restapi3.apiary.io/notes"
    fmt.Println("URL:>", url)

    s := napping.Session{}
    h := &http.Header{}
    h.Set("X-Custom-Header", "myvalue")
    s.Header = h

    var jsonStr = []byte(`
{
    "title": "Buy cheese and bread for breakfast."
}`)

    var data map[string]json.RawMessage
    err := json.Unmarshal(jsonStr, &data)
    if err != nil {
        fmt.Println(err)
    }

    resp, err := s.Post(url, &data, nil, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("response Status:", resp.Status())
    fmt.Println("response Headers:", resp.HttpResponse().Header)
    fmt.Println("response Body:", resp.RawText())

}

এই কোডটি JSON সঠিকভাবে প্রেরণ করে না, তবে কেন জানি না। JSON স্ট্রিং প্রতিটি কলে আলাদা হতে পারে। আমি Structএই জন্য ব্যবহার করতে পারি না ।


আপনি ব্যবহার করেন এমন কয়েকটি লাইব্রেরির সাথে আমি পরিচিত নই, তবে আমি এটি বুঝতে পেরে আপনি জসনের মানচিত্র প্রেরণের চেষ্টা করছেন। আপনি শুধু জোসনের সাথে স্ট্রিংটি পাঠাচ্ছেন না কেন?
টোপো

1
আপনি যদি জসন প্রেরণ করতে চান তবে আপনি কেন জোনসকে আনমারশেল করছেন?
জিমবি

কিছুটা টিপস, আপনি নিজের বার্তাটি স্ট্রাক্ট বা মানচিত্র [স্ট্রিং] ইন্টারফেস হিসাবে তৈরি করতে পারেন - আপনি চান সমস্ত মান যুক্ত করতে এবং তারপরে json.Marshall ব্যবহার করে মানচিত্র বা কাঠামোটিকে একটি জসনে রূপান্তর করতে।
টোপো

@ টপো, আমি ন্যাপিংয়ের উত্স কোডটি খনন করেছি, যদি পে-লোড সেট করা থাকে, তারা json.Marshallএটিকে ডাকে , আমি নিশ্চিত নই কেন এটি তার পক্ষে কাজ করছে না।
ওয়ানফোন

উত্তর:


501

আমি নেপিংয়ের সাথে পরিচিত নই, তবে গোলাংয়ের net/httpপ্যাকেজটি ব্যবহার করে খুব ভাল কাজ করে ( খেলার মাঠ ):

func main() {
    url := "http://restapi3.apiary.io/notes"
    fmt.Println("URL:>", url)

    var jsonStr = []byte(`{"title":"Buy cheese and bread for breakfast."}`)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
    req.Header.Set("X-Custom-Header", "myvalue")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

1
এখন এটি খেলার মাঠে আতঙ্ক আছে। আপনি কি শিল্ড ফিক্স বা কিছু আপডেট করতে পারেন?
অল্টেরিওন

9
@ অ্যালটেনারিয়ন এটি খেলার মাঠে কাজ করতে পারে না, আমি কোডটি পেস্ট করার জন্য কেবল এটি ব্যবহার করেছি, আপনি এটি থেকে বাহ্যিক সংযোগগুলি খুলতে পারবেন না।
ওয়ানঅফনে

8
শক্ত ব্যান্ড নামের পরামর্শের জন্য @ অ্যাল্টেনারিয়ন +1।
চার্লি শ্লিয়েসার

8
শুধু একটি সতর্কবার্তা ভুলবেন না যে ডিফল্টরূপে golang HTTP ক্লায়েন্ট কখনো টাইম আউট করা, তাই বাস্তব জগতে জন্য, লাইন বরাবর সেট কিছু সেরাclient.Timeout = time.Second * 15
svarlamov

1
এটির সমস্ত ত্রুটিগুলি সংগ্রহ / পরীক্ষা করার জন্য এটি আপডেট করা যেতে পারে? এটি (কমপক্ষে আমার জন্য) গোয়ে পোস্ট অনুরোধ করার জন্য গুগলের শীর্ষ ফলাফল, এবং এটি একটি ভাল উত্তর, তবে আমি একটি টন উদাহরণ কোড দেখতে পাচ্ছি যা কেবল ত্রুটি উপেক্ষা করে এবং আমি মনে করি এটি newbies এ খারাপ অভ্যাসকে উত্সাহিত করে। তারপরে আবার কেউ যদি ত্রুটিগুলিকে নিয়মিত উপেক্ষা করে তবে আমি মনে করি তারা শেষ পর্যন্ত না কেন শিখবে, তবে কেন ভাল অনুশীলন শুরু করার জন্য উত্সাহিত করবে না?
কে রোডা

103

আপনি কেবল postআপনার জসন পোস্ট করতে ব্যবহার করতে পারেন ।

values := map[string]string{"username": username, "password": password}

jsonValue, _ := json.Marshal(values)

resp, err := http.Post(authAuthenticatorUrl, "application/json", bytes.NewBuffer(jsonValue))

3
আমি এই ত্রুটিটি পেয়েছি:cannot use jsonValue (type []byte) as type io.Reader in argument to http.Post: []byte does not implement io.Reader (missing Read method)
মান্দার ভ্যাজ

@MandarVaze আমি তোমাকে ভুল বুঝবেন পারে মনে io.Readerজন্য http.Post, এবং bytes.NewBuffer () আমার কোড ভাল কাজ করে
gaozhidf

1
আমি 1.7 যেতে চলেছি, যদি এটি গুরুত্বপূর্ণ হয়। @ ওয়ানওফোন দ্বারা তালিকাভুক্ত কোডটি কাজ করে (যা পরিবর্তে ব্যবহার করে bytes.NewBuffer()তবে ব্যবহার http.NewRequestকরে http.Post)
মান্দার ওয়াজে

2
Golang.org/pkg/net/http/# পোস্টের মতে , "কলার resp.Bodyএটি থেকে পড়া শেষ করা উচিত io.Closerthe আমি কীভাবে বলব, গো নবাগত হিসাবে, যদি শরীরটি একটি হয় io.Closer, বা অন্য কথায়, যদি এই উদাহরণটি নিরাপদ থাকে?
ডেনিস

14

আপনার যদি ইতিমধ্যে একটি কাঠামো থাকে।

type Student struct {
    Name    string `json:"name"`
    Address string `json:"address"`
}

// .....

body := &Student{
    Name:    "abc",
    Address: "xyz",
}

buf := new(bytes.Buffer)
json.NewEncoder(buf).Encode(body)
req, _ := http.NewRequest("POST", url, buf)

client := &http.Client{}
res, e := client.Do(req)
if e != nil {
    return e
}

defer res.Body.Close()

fmt.Println("response Status:", res.Status)
// Print the body to the stdout
io.Copy(os.Stdout, res.Body)

ফুল সারকথা


12

স্ট্যান্ডার্ড নেট / HTTP প্যাকেজ ছাড়াও, আপনি আমার GoRequest ব্যবহার করে বিবেচনা করতে পারেন যা নেট / এইচটিপি চারপাশে মোড়ানো এবং জেসন বা স্ট্রাক্ট সম্পর্কে খুব বেশি চিন্তা না করে আপনার জীবনকে আরও সহজ করে তুলবে। তবে আপনি উভয়কে এক অনুরোধে মেশাতে এবং মিলাতেও পারেন! (আপনি গোরোকেস্ট গিথুব পৃষ্ঠায় এটি সম্পর্কে আরও বিশদ দেখতে পারেন)

সুতরাং, শেষ পর্যন্ত আপনার কোড অনুসরণের মতো হয়ে উঠবে:

func main() {
    url := "http://restapi3.apiary.io/notes"
    fmt.Println("URL:>", url)
    request := gorequest.New()
    titleList := []string{"title1", "title2", "title3"}
    for _, title := range titleList {
        resp, body, errs := request.Post(url).
            Set("X-Custom-Header", "myvalue").
            Send(`{"title":"` + title + `"}`).
            End()
        if errs != nil {
            fmt.Println(errs)
            os.Exit(1)
        }
        fmt.Println("response Status:", resp.Status)
        fmt.Println("response Headers:", resp.Header)
        fmt.Println("response Body:", body)
    }
}

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


যদি GoRequest নেট / এইচপি র্যাপ করে। টিএলএস-এর জন্য সুরক্ষার অক্ষর অক্ষম করার জন্য এটি যুক্ত করা কি সম্ভব? tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }
ব্যবহারকারী 1513388

46
@ user1513388 এটা সবসময় একটি ভয়ানক ধারণা কোন ভাষায় কোন দৃশ্যকল্প আপনি TLS যাচাইকরণ কুঁদন কোড উদাহরণ অবদান আছে ... আপনি দূর্ঘটনাক্রমে অনেক কপি চিরস্থায়ী / neophytes যারা Stackoverflow যান এবং কেন প্রকৃতি বুঝতে পারছি না করে "সমাধান নীচে উপস্থিত" পেস্ট ফিক্সিং টিএলএস ত্রুটিগুলি অত্যন্ত গুরুত্বপূর্ণ। হয় আপনার শংসাপত্র আমদানির পথটি ঠিক করুন (যদি পরীক্ষার জন্য স্ব-স্বাক্ষরকারী ব্যবহার করেন, সেগুলি আমদানি করুন) বা আপনার মেশিনের শংসাপত্র শৃঙ্খলা ঠিক করুন, বা আপনার ক্লায়েন্ট কর্তৃক যাচাই করা যাচ্ছে না এমন কোনও সার্ভার কেন একটি অবৈধ শংসাপত্র উপস্থাপন করছে তা সন্ধান করুন।
মাইক অ্যাটলাস

1
এই উত্তরটির বিষয়ে আমি ঠিক একটি জিনিস পছন্দ করি না এটি হ'ল এটি জেএসওএন অবজেক্টটি রচনা করে, যা ইনজেকশনের মাধ্যমে সম্ভাব্যভাবে শোষণযোগ্য। আরও ভাল উপায় হ'ল কোনও অবজেক্ট রচনা করা এবং তারপরে এটি জেএসএনে রূপান্তর করা (যথাযথ পালিয়ে যাওয়া সহ)।
জন হোয়াইট

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