> Из чего состоит 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. Формально он состоит из:

  1. Стартовая строка - первая строка запроса. Формат: METHOD URI HTTP/Version. Пример: POST /api/users HTTP/1.1. Метод определяет семантику операции (GET - чтение, POST - создание, PUT - обновление, DELETE - удаление). URI - путь к ресурсу на сервере. Версия протокола - обычно HTTP/1.1 или HTTP/2.

  2. Заголовки - набор пар ключ: значение, каждая на отдельной строке. Они передают служебную информацию:

    • Host - обязательный, указывает домен
    • Content-Type - формат тела (application/json, multipart/form-data)
    • Content-Length - размер тела в байтах
    • Authorization - токен доступа
    • Accept - какие форматы ответа клиент готов принять
    • User-Agent - информация о клиенте (в iOS - название приложения и версия ОС)
    • Кастомные заголовки, например X-Request-ID для трейсинга
  3. Тело (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.

Пример кода

SWIFT
import 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)
// Отправка через URLSession
let 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: первый описывает формат тела запроса, второй - желаемый формат ответа

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью