3

I was having an issue when I was passing string in http.NewRequest in golang body param.

The error I got was :

cannot use req.Body (type string) as type io.Reader in argument to http.NewRequest: string does not implement io.Reader (missing Read method)

Similarly there are other use cases where the Buffer is required as an input instead of a particular type or an array of it. eg, byte[] when input required is buffer.

What did the error mean and what are ways of solving it and understanding what golang is trying to enforce.

Edit: This was the line I was having an issue with and did not find any references.

http.NewRequest(req.Method, req.Url, req.Body)

http.NewRequest(req.Method, req.Url, strings.NewReader(req.Body)) solves the issue. I was planning to add the answer as well (as an FYI type of question)

Prateek
  • 6,644
  • 6
  • 22
  • 26

1 Answers1

7

This error means that the http.NewRequest method take a io.Reader interface as its body argument:

func NewRequest(method, urlStr string, body io.Reader) (*Request, error)

It is done this way so you can pass a file, a connection to a server, the response from something else to the request easily.

The "problem" is that a string doesn't implement the io.Reader interface, which is defined as follow:

type Reader interface {
   Read(p []byte) (n int, err error)
}

Its not a huge problem, you can use the strings.Reader type which is a wrapper around a string that implement the said interface.

func NewReader(s string) *Reader

Tip: There also is a bytes.Reader type for the times you have a []byte to pass as parameter.

Elwinar
  • 9,103
  • 32
  • 40