In order to post JSON body during post request, we need to convert the data to byte array format and send it along with the request.
You can convert the JSON to a byte array using "encoding/json" package. Then use the NewBuffer method to pass this byte array to the post method.
You can convert the JSON to a byte array using "encoding/json" package. Then use the NewBuffer method to pass this byte array to the post method.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
//If the struct variable names does not match with json attributes
//then you can define the json attributes actual name after json:attname as shown below.
type User struct {
Name string `json:"name"`
Job string `json:"job"`
}
func main(){
//Create user struct which need to post.
user := User{
Name: "Test User",
Job: "Go lang Developer",
}
//Convert User to byte using Json.Marshal
//Ignoring error to
body, _ := json.Marshal(user)
//Pass new buffer for request with URL to post.
resp, err := http.Post("https://reqres.in/api/users", "application/json", bytes.NewBuffer(body) )
// An error is returned if there were too many redirects
// or if there was an HTTP protocol error
if err != nil {
panic(err)
}
//Need to close the response stream, once response is read.
//Hence defer close. It will automatically take care of it.
defer resp.Body.Close()
//Check response code, if New user is created then read response.
if resp.StatusCode == http.StatusCreated {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
//Failed to read response.
panic(err)
}
//Convert bytes to String and print
jsonStr := string(body)
fmt.Println("Response: ", jsonStr)
} else {
//The status is not Created. print the error.
fmt.Println("Get failed with error: ", resp.Status)
}
}