Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpHsPs 245 of 280 menu
◀ ▶

Тело входящего запроса в 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 с обработчиком только для отправки. Скажите, что получит клиент при просмотре этого пути без тела.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить