Заголовки HTTP-запроса в Go
Кроме адреса и метода запрос несет заголовки: короткие пары имя и значение. Их задают на объекте запроса до отправки. Заголовки ответа читают из объекта ответа после того, как команда выполнения вернула результат.
Готовую пару адрес и метод собирают отдельной
командой создания запроса. Поле Header
принимает значение через Set. Отправка
идет через значение типа Client
и его метод выполнения, а не только через
короткую команду получения без настроек.
Попросим ответ в формате JSON и прочитаем тип содержимого:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
req, err := http.NewRequest(
"GET",
"https://example.com/data",
nil,
)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
ctype := resp.Header.Get("Content-Type")
fmt.Println(ctype)
_, err = io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
}
Метод Get на заголовках ответа
возвращает первое значение для имени. Если
заголовка нет, придет пустая строка.
Передадим токен доступа на локальный сервис:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
req, err := http.NewRequest(
"GET",
"http://127.0.0.1:8080/profile",
nil,
)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer demo")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(len(body))
}
Дан адрес "https://example.com":
addr := "https://example.com"
Создайте запрос с методом получения, задайте
заголовок User-Agent со значением
"lesson/1", отправьте через клиент
и выведите код состояния.
Дан следующий код:
req, err := http.NewRequest("GET", addr, nil)
if err != nil {
log.Fatal(err)
}
resp, err := http.DefaultClient.Do(req)
Скажите, что нужно добавить до выполнения,
если сервер ждет заголовок X-Request-Id.
Скажите, где читать заголовок ответа после
успешного Do, если переменная ответа
называется resp.