Какой HTTP-заголовок указывает тип передаваемых данных (Content-Type)?

Ответ

Тип контента указывается в заголовке Content-Type. Он сообщает серверу (в запросе) или клиенту (в ответе), в каком формате представлены данные в теле сообщения (body).

Распространенные значения:

  • application/json — для данных в формате JSON.
  • application/x-www-form-urlencoded — для данных HTML-форм.
  • multipart/form-data — для загрузки файлов.
  • text/html, image/png — для конкретных типов контента.

Пример установки заголовка в URLRequest:

var request = URLRequest(url: url)
request.httpMethod = "POST"
// Ключевой заголовок для JSON
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let userData = ["name": "John"]
request.httpBody = try JSONEncoder().encode(userData)

Пример проверки типа ответа:

URLSession.shared.dataTask(with: request) { data, response, error in
    guard let httpResponse = response as? HTTPURLResponse,
          httpResponse.statusCode == 200,
          let mimeType = httpResponse.mimeType,
          mimeType == "application/json" else {
        // Обработка ошибки несоответствия типа
        return
    }
    // Декодируем JSON-данные
    let model = try JSONDecoder().decode(Model.self, from: data!)
}.resume()

Важно: Для multipart/form-data значение заголовка также включает уникальный разделитель (boundary), например: Content-Type: multipart/form-data; boundary=Boundary-ABC123.

Ответ 18+ 🔞

А, слушай, вот эта ваша ебучая Content-Type — это ж как на посылке маркировка, блядь. Ты ж не пошлёшь холодильник в конверте, верно? Так и тут: серверу или клиенту надо чётко знать, что за хуйню ты ему в тело запроса засунул.

Основные приколы, которые ты встретишь:

  • application/json — это когда ты кидаешь данные, как будто они из JSON-мира, всё ровно, структурированно.
  • application/x-www-form-urlencoded — старый добрый формат HTML-форм, где всё в одну строку склеено, знаками &.
  • multipart/form-data — вот это уже цирк, блядь, когда файлы тащишь. Тут своя магия с разделителями.
  • text/html, image/png — тут и так понятно, либо текст для браузера, либо картинка.

Вот смотри, как это в коде выглядит, если ты JSON шлёшь:

var request = URLRequest(url: url)
request.httpMethod = "POST"
// Вот этот самый важный заголовок, сука! Без него сервер тебя не поймёт.
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let userData = ["name": "John"]
request.httpBody = try JSONEncoder().encode(userData)

А когда ответ приходит, надо проверить, не обманули ли тебя, не прислали ли какую-нибудь хуйню вместо JSON:

URLSession.shared.dataTask(with: request) { data, response, error in
    guard let httpResponse = response as? HTTPURLResponse,
          httpResponse.statusCode == 200,
          let mimeType = httpResponse.mimeType,
          mimeType == "application/json" else {
        // Вот тут, блядь, понимаешь, что тебя наебали. Тип не тот, статус код не 200 — пиздец, ошибка.
        return
    }
    // А вот если всё чики-пуки, можно данные декодировать.
    let model = try JSONDecoder().decode(Model.self, from: data!)
}.resume()

И главное, ёпта, запомни: для multipart/form-data заголовок — это не просто слова. Там ещё этот чёртов boundary прицеплен, уникальная строка-разделитель. Выглядит как пиздец какой-то ритуал: Content-Type: multipart/form-data; boundary=Boundary-ABC123. Без этого boundary твои файлы просто потеряются в небытии, как твои носки в стиральной машине.