How do I send a JSON string in a POST request in Go

后端 未结 4 517
执笔经年
执笔经年 2020-11-30 16:17

I tried working with Apiary and made a universal template to send JSON to mock server and have this code:

package main

import (
    \"encoding/json\"
    \"         


        
相关标签:
4条回答
  • 2020-11-30 16:42

    you can just use post to post your json.

    values := map[string]string{"username": username, "password": password}
    
    jsonValue, _ := json.Marshal(values)
    
    resp, err := http.Post(authAuthenticatorUrl, "application/json", bytes.NewBuffer(jsonValue))
    
    0 讨论(0)
  • 2020-11-30 16:52

    If you already have a struct.

    import (
        "bytes"
        "encoding/json"
        "io"
        "net/http"
        "os"
    )
    
    // .....
    
    type Student struct {
        Name    string `json:"name"`
        Address string `json:"address"`
    }
    
    // .....
    
    body := &Student{
        Name:    "abc",
        Address: "xyz",
    }
    
    payloadBuf := new(bytes.Buffer)
    json.NewEncoder(payloadBuf).Encode(body)
    req, _ := http.NewRequest("POST", url, payloadBuf)
    
    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)
    

    Full gist.

    0 讨论(0)
  • 2020-11-30 16:53

    I'm not familiar with napping, but using Golang's net/http package works fine (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))
    }
    
    0 讨论(0)
  • 2020-11-30 16:54

    In addition to standard net/http package, you can consider using my GoRequest which wraps around net/http and make your life easier without thinking too much about json or struct. But you can also mix and match both of them in one request! (you can see more details about it in gorequest github page)

    So, in the end your code will become like follow:

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

    This depends on how you want to achieve. I made this library because I have the same problem with you and I want code that is shorter, easy to use with json, and more maintainable in my codebase and production system.

    0 讨论(0)
提交回复
热议问题