Python · API · Начальный уровень

Заголовки и Echo-эндпоинт

5 задач

Добавляйте собственные HTTP-заголовки к запросам и используйте echo-эндпоинт для проверки отправленных данных.

HTTP-заголовки

#
Каждый HTTP-запрос несёт метаданные вместе с телом: это заголовки. Они сообщают серверу такие вещи: какой формат ответа вы ожидаете, кто вы и как интерпретировать тело запроса. Чтобы отправить собственные заголовки через requests, передайте dict как аргумент headers: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' headers = { 'Accept': 'application/json', 'User-Agent': 'MyScript/1.0', } response = requests.get(f'{BASE_URL}/api/products/', headers=headers) ``` Несколько часто встречающихся заголовков: - User-Agent — идентифицирует ваш клиент. Серверы иногда логируют это или блокируют неизвестных агентов. requests отправляет по умолчанию что-то вроде 'python-requests/2.x.x'. - Accept — сообщает серверу, какой формат вы хотите получить. Для JSON API это обычно 'application/json', хотя сервер часто игнорирует это и возвращает JSON независимо от значения. - Content-Type — описывает формат тела, которое вы отправляете (для POST/PUT/PATCH). requests устанавливает это автоматически при использовании json=. - Authorization — передаёт учётные данные для аутентификации. Рассматривается в темах об авторизации. Вы также можете читать заголовки, отправленные сервером в ответе: ```python response = requests.get(f'{BASE_URL}/api/products/') print(response.headers['Content-Type']) # application/json print(response.headers.get('X-Custom', '')) # '' если нет ``` response.headers нечувствителен к регистру — 'content-type' и 'Content-Type' возвращают одинаковое значение.

Использование echo-эндпоинта

#
Эндпоинт echo отражает ваш запрос в виде JSON. Он предназначен для отладки — вы можете увидеть именно то, что получил сервер: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' response = requests.get(f'{BASE_URL}/api/echo/') print(response.json()) ``` Ответ содержит метод, путь, заголовки и тело, которые получил сервер. Теперь добавьте собственный заголовок и посмотрите, как он появится: ```python headers = {'X-My-Header': 'hello', 'User-Agent': 'MyBot/1.0'} response = requests.get(f'{BASE_URL}/api/echo/', headers=headers) data = response.json() print(data['headers']['X-My-Header']) # 'hello' print(data['headers']['User-Agent']) # 'MyBot/1.0' ``` Отправьте POST с JSON-телом и проверьте его: ```python payload = {'action': 'test', 'value': 42} response = requests.post(f'{BASE_URL}/api/echo/', json=payload) data = response.json() print(data['method']) # 'POST' print(data['body']) # пейлоад, который вы отправили ``` При использовании json= requests автоматически устанавливает Content-Type в application/json и сериализует dict. Это можно подтвердить через echo: ```python print(data['headers']['Content-Type']) # application/json ``` Эндпоинт echo также принимает произвольные пути, что удобно для тестирования поведения разных форм URL: ```python response = requests.get(f'{BASE_URL}/api/echo/debug/anything/you/want/') print(response.json()['path']) # '/api/echo/debug/anything/you/want/' ```

Справочник заголовков и echo

#
Эндпоинты echo: ``` GET/POST/PUT/PATCH/DELETE /api/echo/ Отражение любого запроса GET/POST/PUT/PATCH/DELETE /api/echo/{path} Отражение с произвольным путём ``` Форма ответа echo: ```json { "method": "POST", "path": "/api/echo/", "headers": { "Content-Type": "application/json", ... }, "body": { ... }, "query_params": { ... } } ``` Распространённые заголовки запроса: ``` User-Agent Идентифицирует ваш клиент Accept Ожидаемый формат ответа (application/json) Content-Type Формат тела запроса (устанавливается автоматически при json=) Authorization Учётные данные (Token ..., Bearer ...) ``` Отправка заголовков: ```python requests.get(url, headers={'X-Custom': 'value'}) requests.post(url, json=payload) # Content-Type устанавливается автоматически ``` Чтение заголовков ответа: ```python response.headers['Content-Type'] # прямой доступ response.headers.get('X-Custom', '') # безопасный доступ со значением по умолчанию ```
01

Обзор ответа echo

#

Отправьте GET-запрос к /api/echo/ и выведите полный JSON-ответ. Обратите внимание, какие заголовки сервер получил от вашего запроса по умолчанию.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Отправьте GET к /api/echo/ и выведите JSON ответа
Решение
import requests
import json

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/echo/')
print(json.dumps(response.json(), indent=2))
02

Отправить собственный заголовок

#

Отправьте GET к /api/echo/ с собственным заголовком X-Client-Name со значением "my-script". Подтвердите, что он появился в ответе echo, выведя его значение из ответа.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Добавьте заголовок X-Client-Name и проверьте его в ответе echo
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

headers = {'X-Client-Name': 'my-script'}
response = requests.get(f'{BASE_URL}/api/echo/', headers=headers)
data = response.json()
print(data['headers']['X-Client-Name'])
03

Изменить User-Agent

#

Отправьте запрос к /api/echo/ с User-Agent "DataCollector/2.0". Выведите значение User-Agent из ответа echo для подтверждения, что он получен.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Установите User-Agent и проверьте через echo
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

headers = {'User-Agent': 'DataCollector/2.0'}
response = requests.get(f'{BASE_URL}/api/echo/', headers=headers)
print(response.json()['headers']['User-Agent'])
04

POST с JSON-телом

#

Отправьте POST к /api/echo/ с JSON-телом, содержащим ключи "name" и "value". Выведите поля method и body из ответа echo.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

payload = {'name': 'test', 'value': 99}

# POST к /api/echo/ и выведите method и body из ответа
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

payload = {'name': 'test', 'value': 99}
response = requests.post(f'{BASE_URL}/api/echo/', json=payload)
data = response.json()
print(data['method'])
print(data['body'])
05

Чтение заголовков ответа

#

Выполните GET /api/products/ и выведите Content-Type и любой заголовок, содержащий "Allow" в названии. Если "Allow" отсутствует — выведите "Не найдено".

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

# Выведите Content-Type и найдите заголовок Allow
Решение
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

print(response.headers['Content-Type'])

allow = response.headers.get('Allow', 'Не найдено')
print(allow)