Можно ли с помощью HTTP-метода POST получить данные от сервера?

«Можно ли с помощью HTTP-метода POST получить данные от сервера?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, технически можно. HTTP-метод определяет семантику запроса, а не запрещает серверу возвращать данные в ответе.

  • GET: Запрос данных. Параметры — в URL (query string). Идемпотентный, кешируемый.
  • POST: Отправка данных для обработки. Параметры — в теле запроса (body). Не идемпотентный.

Когда используют POST для «получения»?

  1. Когда параметры запроса слишком сложны или велики для URL (например, большой GraphQL-запрос).
  2. Для операций, которые логически являются командами, но также возвращают результат (например, создание ресурса с возвратом его ID).
  3. В некоторых устаревших или специфичных API.

Пример на Swift (URLSession):

let url = URL(string: "https://api.example.com/graphql")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let graphQLQuery = """
{ "query": "{ user(id: 123) { name } }" }
"""
request.httpBody = graphQLQuery.data(using: .utf8)

let task = URLSession.shared.dataTask(with: request) { data, _, error in
    // Обрабатываем данные (data), полученные в ответ на POST-запрос
    if let data = data {
        print(String(data: data, encoding: .utf8) ?? "")
    }
}
task.resume()

Best practice: Для чисто читающих операций предпочтительнее GET. Используйте POST, когда запрос изменяет состояние на сервере или не вписывается в ограничения GET.