Ответ
Да, технически можно. HTTP-метод определяет семантику запроса, а не запрещает серверу возвращать данные в ответе.
- GET: Запрос данных. Параметры — в URL (query string). Идемпотентный, кешируемый.
- POST: Отправка данных для обработки. Параметры — в теле запроса (body). Не идемпотентный.
Когда используют POST для «получения»?
- Когда параметры запроса слишком сложны или велики для URL (например, большой GraphQL-запрос).
- Для операций, которые логически являются командами, но также возвращают результат (например, создание ресурса с возвратом его ID).
- В некоторых устаревших или специфичных 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.