Ответ
Тип контента указывается в заголовке 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 твои файлы просто потеряются в небытии, как твои носки в стиральной машине.