При получении пост-запроса, тело самого запроса пустое
Возникли проблемы при связи клиента и сервера. Не мог никак разобраться и пришлось писать "голые" клиент-сервер, но в чем проблема так и не смог понять.
Сама проблема: сервер получает пустое тело.
Вот сервер:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func main() {
router := mux.NewRouter()
router.HandleFunc("/api/", handler)
log.Fatal(http.ListenAndServe(":8081", router))
}
func handler(w http.ResponseWriter, r *http.Request) {
data := []byte{}
if _, err := r.Body.Read(data); err != nil {
log.Println(err)
}
fmt.Println(data, string(data))
}
Вот клиент отправляющий запрос:
package main
import (
"bytes"
"fmt"
"log"
"net/http"
)
func main() {
data := []byte(`{seats: "5", ac: "yes"}`)
r := bytes.NewReader(data)
resp, err := http.Post("http://localhost:8081/api/", "application/json", r)
if err != nil {
log.Println(err)
}
fmt.Println(resp)
}
Ответы (1 шт):
Автор решения: Pak Uula
→ Ссылка
Какой размер буфера вы отвели, сколько вам Read
и прочитал. Этот метод просто читает в массив байты, не предпринимая никаких действий, если данные в буфер не вместились.
В пакете bytes
есть буфер, который может "раздуваться", пока не вместит все данные, а в пакете io
есть метод Copy
, который перекачивает содержимое io.Reader
в io.Writer
. Если вы замените в вашем коде чтение на вот такой кусок, то всё заработает:
data := &bytes.Buffer{}
_, err := io.Copy(data, r.Body)
if err != nil {
panic(err)
}
fmt.Println(data, data.String())