Tomas Nemeth
Tomas Nemeth

Reputation: 95

Golang - Sending API POST Request - Not enough arguments error

The following code attempts to send a POST API request with a payload that is in RequestDetails.FormData. When I run main.go function, then I get the following errors.

go run main.go
# command-line-arguments
./main.go:53:17: not enough arguments in call to http.HandleFunc
./main.go:53:33: not enough arguments in call to reqDetails.Send
        have ()
        want (http.ResponseWriter, *http.Request)
./main.go:53:33: reqDetails.Send() used as value

The code is available below. Anybody knows what I could do wrong here? Thanks a lot for your help.

//main.go

package main

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

// RequestDetails contains input data for Send
type RequestDetails struct {
    EndPoint string
    FormType string
    FormData map[string]string
}

// Send sends API POST request to an endpoint
func (rd RequestDetails) Send(w http.ResponseWriter, r *http.Request) {

    json_data, err := json.Marshal(rd.FormData)

    if err != nil {
        log.Fatal(err)
    }

    resp, err := http.Post(rd.EndPoint, rd.FormType, bytes.NewBuffer(json_data))

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(resp)

}

func main() {
    m := map[string]string{
        "AuthParamOne":   "AP0000001",
        "AuthParamTwo":   "AP0000002",
        "AuthParamThree": "AP0000003",
    }

    reqDetails := RequestDetails{
        EndPoint: "https://httpbin.org/post",
        FormType: "application/json",
        FormData: m,
    }

    http.HandleFunc(reqDetails.Send())
}

Upvotes: 0

Views: 747

Answers (3)

Schart
Schart

Reputation: 56

if your code like this

watcher := bufio.NewReader(os.Stdin)
input, _ := watcher.ReadString()    
fmt.Println(input)

you needed this for reading line line

old -> input, _ := watcher.ReadString()   
new -> input, _ := watcher.ReadString('\n')   

Upvotes: 0

mrasoolmirza
mrasoolmirza

Reputation: 907

In your Send method, you don't make use of w http.ResponseWriter, r *http.Request, So it seems you don't need them:

func (rd RequestDetails) Send() {...

Also in your last line, HandleFunc requires different arguments which once again is not necessary in your case. Just try to run the Send method:

reqDetails.Send()

The whole main.go file:

//main.go

package main

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

// RequestDetails contains input data for Send
type RequestDetails struct {
    EndPoint string
    FormType string
    FormData map[string]string
}

// Send sends API POST request to an endpoint
func (rd RequestDetails) Send() {

    json_data, err := json.Marshal(rd.FormData)

    if err != nil {
        log.Fatal(err)
    }

    resp, err := http.Post(rd.EndPoint, rd.FormType, bytes.NewBuffer(json_data))

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(resp)

}

func main() {
    m := map[string]string{
        "AuthParamOne":   "AP0000001",
        "AuthParamTwo":   "AP0000002",
        "AuthParamThree": "AP0000003",
    }

    reqDetails := RequestDetails{
        EndPoint: "https://httpbin.org/post",
        FormType: "application/json",
        FormData: m,
    }

    reqDetails.Send()
}

Upvotes: 2

0xbeny
0xbeny

Reputation: 303

you have to use HandleFunc in following below:

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

for code above follow this:

http.HandleFunc("/test",reqDetails.Send) //-> add reference instead of calling 'reqDetails.Send()'

reference: https://pkg.go.dev/net/http#HandleFunc

please vote up :)

Upvotes: 3

Related Questions