Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Http POST request with body Go

Tags:

http

go

I want to construct a HTTP POST request with a body using Go net/http library.

The function I am using to construct the http request is the following: docs

http.NewRequest(method string, url string, body io.Reader)

I came up with 2 solutions, but I am trying to see which one is more idiomatic and extensible to support different body configurations.

Solution #1

bytesObj := []byte(`{"key":"value"}`)
body := bytes.NewBuffer(bytesObj)

Solution #2

bodyMap := map[string]string{"key":"value"}
bodyBytes, _ := json.Marshal(bodyMap)
body := bytes.NewBuffer(bodyBytes)

Ideally, I will move the code to a helper function that way I can customize the construction of the body. The helper function will be something like

func constructBody(someArgument) io.Reader {
  return bodyHere
}
like image 673
Adolfo Avatar asked Oct 31 '25 05:10

Adolfo


1 Answers

If the body is already string, options #1 is more compelling to me.

If you are only working with a key -> value with only string, option #2 is better. But this will become cumbersome when you have nested struct

But most of the time in my experience we are dealing with struct. I like to make the struct closer to where the http call happened.

func main() {
    ctx := context.Background()

    body := struct {
        Key string `json:"key"`
    }{
        Key: "value",
    }

    out, err := json.Marshal(body)
    if err != nil {
        log.Fatal(err)
    }


    req, err := http.NewRequest("POST", "http://example.com", bytes.NewBuffer(out))
    if err != nil {
        log.Fatal(err)
    }

    req = req.WithContext(ctx)

    http.DefaultClient.Do(req)
}

And if the struct is used in multiple places, you can make a package level struct.

like image 176
ahmy Avatar answered Nov 03 '25 03:11

ahmy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!