DEV Community

Kiran
Kiran

Posted on • Updated on • Originally published at kirandev.com

Make an HTTP POST request in Go

We’ll explore how to make an HTTP POST request in Go. We will make a POST request to an endpoint with a JSON body and display the results on the console.

The endpoint will accept id, title, body, userId and create a new post.

Create a new folder called http-request.

mkdir http-request

cd http-request

touch main.go
Enter fullscreen mode Exit fullscreen mode

Open the main.go and import the necessary packages.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)
Enter fullscreen mode Exit fullscreen mode

Create a struct that models the data received from the API.

type Post struct {
    Id     int    `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
    UserId int    `json:"userId"`
}
Enter fullscreen mode Exit fullscreen mode

Create a POST request using the method http.NewRequest.

func main() {
    // HTTP endpoint
    posturl := "https://jsonplaceholder.typicode.com/posts"

    // JSON body
    body := []byte(`{
        "title": "Post title",
        "body": "Post description",
        "userId": 1
    }`)

    // Create a HTTP post request
    r, err := http.NewRequest("POST", posturl, bytes.NewBuffer(body))
    if err != nil {
        panic(err)
    }
}
Enter fullscreen mode Exit fullscreen mode

Set the HTTP request header.

r.Header.Add("Content-Type", "application/json")
Enter fullscreen mode Exit fullscreen mode

Create a client and make the post request using the method client.Do

client := &http.Client{}
res, err := client.Do(r)
if err != nil {
    panic(err)
}

defer res.Body.Close()
Enter fullscreen mode Exit fullscreen mode

Let's decode the JSON response using json.NewDecoder function that takes in the response body and a decode function that takes in a variable of type Post.

post := &Post{}
derr := json.NewDecoder(res.Body).Decode(post)
if derr != nil {
    panic(derr)
}
Enter fullscreen mode Exit fullscreen mode

Panic if the HTTP status code not equals to 201.

if res.StatusCode != http.StatusCreated {
    panic(res.Status)
}
Enter fullscreen mode Exit fullscreen mode

Finally, print the newly created post on the console.

fmt.Println("Id:", post.Id)
fmt.Println("Title:", post.Title)
fmt.Println("Body:", post.Body)
fmt.Println("UserId:", post.UserId)
Enter fullscreen mode Exit fullscreen mode

Here is the complete working code.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

type Post struct {
    Id     int    `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
    UserId int    `json:"userId"`
}

func main() {
    posturl := "https://jsonplaceholder.typicode.com/posts"

    body := []byte(`{
        "title": "Post title",''
        "body": "Post description",
        "userId": 1
    }`)

    r, err := http.NewRequest("POST", posturl, bytes.NewBuffer(body))
    if err != nil {
        panic(err)
    }

    r.Header.Add("Content-Type", "application/json")

    client := &http.Client{}
    res, err := client.Do(r)
    if err != nil {
        panic(err)
    }

    defer res.Body.Close()

    post := &Post{}
    derr := json.NewDecoder(res.Body).Decode(post)
    if derr != nil {
        panic(derr)
    }

    if res.StatusCode != http.StatusCreated {
        panic(res.Status)
    }

    fmt.Println("Id:", post.Id)
    fmt.Println("Title:", post.Title)
    fmt.Println("Body:", post.Body)
    fmt.Println("UserId:", post.UserId)
}
Enter fullscreen mode Exit fullscreen mode

I hope you found this article insightful.

Let's connect 🌎

Discussion (0)