РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1020 of 1593 menu

Тип http.Request

Тип http.Request из пакета net/http представляет собой HTTP-запрос. Он используется как на стороне сервера для получения данных от клиента, так и на стороне клиента для формирования и отправки запросов. Структура содержит поля для метода запроса, URL, заголовков, тела, параметров формы, cookie и контекста.

При обработке запроса на сервере, структура http.Request передается в функцию-обработчик. На клиенте она создается с помощью функции http.NewRequest.

Создание запроса

Для создания нового запроса используется функция http.NewRequest. Она принимает метод, URL-строку и тело запроса:

package main import ( "bytes" "fmt" "net/http" ) func main() { body := []byte(`{"name":"John"}`) req, err := http.NewRequest("POST", "https://example.com/api", bytes.NewBuffer(body)) if err != nil { fmt.Println("Error creating request") return } fmt.Println(req.Method) fmt.Println(req.URL.String()) }

Результат выполнения кода:

"POST" "https://example.com/api"

В первом параметре передается метод запроса, во втором - URL-адрес, в третьем - тело запроса в виде io.Reader. Если тело не требуется, передается nil.

Поля структуры

Основные поля структуры http.Request:

  • Method - строка, содержащая HTTP-метод (например, "GET", "POST", "PUT")
  • URL - указатель на тип url.URL, содержащий полный URL запроса
  • Header - карта заголовков запроса типа http.Header
  • Body - интерфейс io.ReadCloser для чтения тела запроса
  • ContentLength - длина тела запроса в байтах

Рассмотрим пример получения данных из запроса:

package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Println("Method:", r.Method) fmt.Println("URL:", r.URL.String()) fmt.Println("Content-Length:", r.ContentLength) fmt.Println("User-Agent:", r.Header.Get("User-Agent")) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }

При обращении к серверу по адресу localhost:8080, в консоль будет выведена информация о запросе:

"Method: GET" "URL: /" "Content-Length: 0" "User-Agent: curl/7.68.0"

Метод Header.Get позволяет получить значение конкретного заголовка по его имени.

Работа с параметрами формы

Для доступа к параметрам формы, переданным в запросе, необходимо вызвать метод ParseForm. После этого данные становятся доступны в поле Form (для всех параметров) и PostForm (только для POST-параметров):

package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { fmt.Println("Parse error") return } name := r.FormValue("name") age := r.FormValue("age") fmt.Println("Name:", name) fmt.Println("Age:", age) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }

При отправке POST-запроса с параметрами name=John&age=30, результат будет:

"Name: John" "Age: 30"

Метод FormValue возвращает значение первого параметра с указанным именем. Он автоматически вызывает ParseForm, если это еще не было сделано.

Работа с cookie

Для получения cookie из запроса используется метод Cookie, который возвращает cookie по имени, или метод Cookies, возвращающий все cookie:

package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { cookie, err := r.Cookie("session_id") if err != nil { fmt.Println("Cookie not found") return } fmt.Println("Session ID:", cookie.Value) allCookies := r.Cookies() fmt.Println("Total cookies:", len(allCookies)) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }

Если cookie с именем session_id присутствует, результат будет:

"Session ID: abc123xyz" "Total cookies: 3"

В первом параметре метод Cookie принимает имя cookie, которое нужно получить. В случае отсутствия cookie возвращается ошибка.

Контекст запроса

Каждый запрос содержит контекст, который можно получить с помощью метода Context. Контекст используется для управления временем жизни запроса и передачи данных между обработчиками:

package main import ( "context" "fmt" "net/http" "time" ) func handler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() select { case <-time.After(5 * time.Second): fmt.Println("Processing completed") case <-ctx.Done(): fmt.Println("Request cancelled:", ctx.Err()) } } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }

При отмене запроса клиентом (например, закрытии вкладки), в консоль будет выведено:

"Request cancelled: context canceled"

Метод Context не принимает параметров и возвращает контекст запроса, который автоматически отменяется при завершении соединения.

Смотрите также

  • тип http.Request.ParseForm,
    который разбирает параметры формы из запроса
  • тип http.Request.Cookie,
    который возвращает cookie по имени из запроса
  • тип http.Request.Context,
    который возвращает контекст запроса
  • функцию http.NewRequest,
    которая создает новый HTTP-запрос
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить