> Из чего состоит HTTP запрос (iOS, Swift)
Уровень: middle · Роль: mobile · Категория: Технические вопросы
Компании: Битрикс24
Стек: iOS, Swift
> Пример ответа
Короткий ответ
HTTP запрос состоит из трёх основных частей: стартовая строка (request line), заголовки (headers) и тело (body). Стартовая строка содержит метод (GET, POST и т.д.), URI и версию протокола. Заголовки передают метаданные: Content-Type, Authorization, User-Agent и другие. Тело опционально - оно есть у POST, PUT, PATCH, но отсутствует у GET и DELETE. В iOS эта структура инкапсулируется в URLRequest, где вы задаёте url, httpMethod, allHTTPHeaderFields и httpBody.
Подробное объяснение
HTTP запрос - это текстовое сообщение, которое клиент отправляет серверу по протоколу HTTP. Формально он состоит из:
-
Стартовая строка - первая строка запроса. Формат:
METHOD URI HTTP/Version. Пример:POST /api/users HTTP/1.1. Метод определяет семантику операции (GET - чтение, POST - создание, PUT - обновление, DELETE - удаление). URI - путь к ресурсу на сервере. Версия протокола - обычно HTTP/1.1 или HTTP/2. -
Заголовки - набор пар
ключ: значение, каждая на отдельной строке. Они передают служебную информацию:Host- обязательный, указывает доменContent-Type- формат тела (application/json, multipart/form-data)Content-Length- размер тела в байтахAuthorization- токен доступаAccept- какие форматы ответа клиент готов принятьUser-Agent- информация о клиенте (в iOS - название приложения и версия ОС)- Кастомные заголовки, например
X-Request-IDдля трейсинга
-
Тело (body) - опциональная часть, отделяется от заголовков пустой строкой. Содержит полезную нагрузку: JSON, XML, бинарные данные, form-data. Отсутствует у GET, HEAD, DELETE (хотя формально DELETE может иметь тело, но это плохая практика).
В iOS разработке вы не работаете с сырым текстом запроса напрямую. Вместо этого используется URLRequest из Foundation. Он оборачивает все компоненты в объектную модель: url, httpMethod, allHTTPHeaderFields, httpBody или httpBodyStream. При использовании URLSession этот объект сериализуется в реальный HTTP запрос автоматически.
На практике
При работе с сетью в iOS важно понимать, как каждый компонент влияет на поведение сервера. Например, неправильный Content-Type приведёт к ошибке 415 Unsupported Media Type. Отсутствие Authorization - к 401. Неверный метод - к 405 Method Not Allowed.
Частая практика - создание универсального сетевого слоя, где запрос строится из модели. Например, enum с эндпоинтами, каждый кейс которого описывает метод, путь, заголовки и параметры. Это позволяет избежать дублирования и упрощает тестирование.
Для загрузки файлов используется multipart/form-data - это особый формат тела, где каждая часть отделяется boundary. В iOS это делается вручную или через библиотеки типа Alamofire.
Пример кода
SWIFTimport Foundation// Создание GET запросаvar getRequest = URLRequest(url: URL(string: "https://api.example.com/users")!)getRequest.httpMethod = "GET"getRequest.setValue("application/json", forHTTPHeaderField: "Accept")getRequest.setValue("Bearer token123", forHTTPHeaderField: "Authorization")// Создание POST запроса с JSON теломvar postRequest = URLRequest(url: URL(string: "https://api.example.com/users")!)postRequest.httpMethod = "POST"postRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")postRequest.setValue("application/json", forHTTPHeaderField: "Accept")let user = ["name": "Иван", "age": 30]postRequest.httpBody = try? JSONSerialization.data(withJSONObject: user)// Отправка через URLSessionlet task = URLSession.shared.dataTask(with: postRequest) { data, response, error in// обработка ответа}task.resume()
Как отвечать на собеседовании
Начните с краткого перечисления трёх частей, затем раскройте каждую. Подчеркните, что тело необязательно и зависит от метода. Упомяните, что в iOS работа идёт через URLRequest, и покажите понимание соответствия между полями URLRequest и частями HTTP запроса.
Если спросят про практику - расскажите про типичные проблемы: неверный Content-Type, отсутствие заголовков авторизации, работа с multipart. Можно упомянуть, что URLSession автоматически добавляет некоторые заголовки (Host, Content-Length), но вы можете переопределить их через URLRequest.
Хорошо показать понимание разницы между HTTP/1.1 и HTTP/2: в HTTP/2 запросы бинарные, но концепция та же - метод, путь, заголовки, тело.
Что проверяет интервьюер
Интервьюер проверяет базовое понимание протокола HTTP, на котором построена вся сетевая коммуникация в мобильных приложениях. Важно не просто перечислить части, а показать понимание их назначения и того, как они влияют на взаимодействие с сервером. Также оценивается практический опыт: знание URLRequest, типичных ошибок, умение строить корректные запросы.
Для middle-позиции ожидается, что кандидат может объяснить, почему GET не имеет тела, как работает авторизация через заголовки, и что происходит при неверном Content-Type. Также важно понимание, что URLSession - это высокоуровневая абстракция, скрывающая детали протокола.
Типичные ошибки
- Забывают упомянуть, что тело опционально и отсутствует у GET
- Путают заголовки запроса и ответа
- Не знают, что Host - обязательный заголовок в HTTP/1.1
- Считают, что в iOS можно изменить любой заголовок - на самом деле некоторые (например, Content-Length) управляются системой
- Не упоминают пустую строку между заголовками и телом - это важный синтаксический элемент
- Говорят, что DELETE не может иметь тело - формально может, но это не рекомендуется
- Путают Content-Type и Accept: первый описывает формат тела запроса, второй - желаемый формат ответа
> Похожие задачи по mobile
Может ли дедлок возникать между задачами на разных очередях
Что происходит при состояниях гонки, дедлоках, инверсии приоритетов, взрыве потоков, голодании и лайфлоке
Использовали ли паттерны Router и Coordinator
Помнишь названия команд или проектов, с которыми работал?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью