Тело входящего запроса в Go
Тело запроса читают, когда метод отправки не пустой просмотр. Для учебного сервера сначала смотрят поле метода у запроса, затем читают поток тела целиком в срез байт.
У входящего запроса тело закрывать не обязательно: рантайм завершит чтение сам. При желании его все же можно закрыть отложенно, как у клиента, но для короткого примера достаточно одного чтения.
Примем текст только при методе отправки:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("POST /echo", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)
return
}
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "read", http.StatusBadRequest)
return
}
fmt.Fprint(w, string(body))
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
При отправке текста hello на
/echo тот же текст вернется
в ответе. Просмотр того же пути получит
код ошибки метода.
Тот же прием для короткого JSON в теле без разбора структуры:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("POST /raw", func(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "read", http.StatusBadRequest)
return
}
fmt.Fprintf(w, "len=%d", len(body))
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
Дан путь /save. Напишите полный
main.go: при отправке на этот
путь верните длину прочитанного тела
числом в тексте ответа.
Дан следующий код:
if r.Method != http.MethodPost {
http.Error(w, "bad method", http.StatusMethodNotAllowed)
return
}
body, err := io.ReadAll(r.Body)
Скажите, при каком методе запроса выполнение дойдет до чтения тела.
Дан путь /echo с обработчиком
только для отправки. Скажите, что получит
клиент при просмотре этого пути без тела.