При получении пост-запроса, тело самого запроса пустое

Возникли проблемы при связи клиента и сервера. Не мог никак разобраться и пришлось писать "голые" клиент-сервер, но в чем проблема так и не смог понять.

Сама проблема: сервер получает пустое тело.

Вот сервер:

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())
→ Ссылка