كيف أقوم بإرسال سلسلة JSON في طلب POST في Go



rest apiary (2)

أنا لست على دراية القيلولة ، ولكن استخدام حزمة net/http Golang يعمل بشكل جيد ( playground ):

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))
}

https://src-bin.com

حاولت العمل مع Apiary وجعلت نموذجًا عامًا لإرسال 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 لهذا الغرض.


Answer #1

بالإضافة إلى حزمة net / http القياسية ، يمكنك التفكير في استخدام GoRequest بي الذي يلتف حول net / http ويجعل حياتك أسهل دون التفكير كثيرًا عن json أو struct. ولكن يمكنك أيضًا مزج كل منهما ومطابقته في طلب واحد! (يمكنك معرفة المزيد من التفاصيل حول هذا الموضوع في صفحة githquest githquest)

لذا ، في النهاية ، سيصبح رمزك على النحو التالي:

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)
    }
}

هذا يعتمد على الطريقة التي تريد تحقيقها. لقد أعددت هذه المكتبة لأنني أواجه نفس المشكلة معك وأريد أن يكون رمزًا أقصر وسهل الاستخدام مع json وأكثر قابلية للإصلاح في نظام التعليمات البرمجية والإنتاج.





apiary