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

Переход по адресу в Go

Сервер может ответить не телом страницы, а указанием другого адреса. Такие ответы помечают кодами триста один и триста два. Стандартный клиент в пакете net/http по умолчанию сам повторяет запрос по новому адресу, пока цепочка не закончится или не сработает лимит.

В учебных задачах иногда нужно увидеть именно первый ответ с переходом, а не финальную страницу. Для этого у клиента задают функцию проверки перехода: если она возвращает особую ошибку, клиент останавливается и оставляет исходный код состояния в объекте ответа.

Остановим автоматический переход:

package main import ( "fmt" "log" "net/http" ) func main() { client := &http.Client{ CheckRedirect: func( req *http.Request, via []*http.Request, ) error { return http.ErrUseLastResponse }, } resp, err := client.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close() fmt.Println(resp.StatusCode) }

На учебном хосте часто приходит код триста два с заголовком нового адреса. Без остановки клиент дошел бы до конечной страницы и показал бы код двести.

Тот же клиент можно передать в выполнение собранного запроса:

package main import ( "fmt" "io" "log" "net/http" ) func main() { client := &http.Client{ CheckRedirect: func( req *http.Request, via []*http.Request, ) error { return http.ErrUseLastResponse }, } req, err := http.NewRequest( "GET", "http://127.0.0.1:8080/old", nil, ) if err != nil { log.Fatal(err) } resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() fmt.Println(resp.StatusCode) loc := resp.Header.Get("Location") fmt.Println(loc) _, err = io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } }

Дан адрес "https://example.com":

https://example.com

Создайте клиент с остановкой перехода, выполните запрос и выведите код состояния первого ответа.

Скажите, какой код состояния вы увидите у клиента по умолчанию для того же адреса и почему он отличается.

Дан следующий код:

resp, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close()

Скажите, сколько раз по сети уйдет запрос при типичном переходе с учебного хоста, если переход не отключали.

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