Тебе нужно пихнуть куда-то JSON, но сервер требует gzip. PHP умеет, но официальная документация пишет так, будто ты защищаешь диссертацию. Ниже — простой рабочий пример с curl и gzencode().
Иногда API не принимает «толстые» запросы и просит всё жать gzip. Это нормальная практика: экономим трафик и ускоряем обработку. В PHP задача решается в лоб: берём Curl, жмём gzencode, вешаем правильные заголовки. Звучит просто, но есть нюанс: если забудешь поставить Content-Encoding: gzip — сервер будет читать мусор.
Пример кода
<?php
function sendCompressedData($url, array $data)
{
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
// Сжимаем данные
$compressed = gzencode($json);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Content-Encoding: gzip',
'Accept-Encoding: gzip',
],
CURLOPT_POSTFIELDS => $compressed,
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new RuntimeException('Curl error: ' . curl_error($ch));
}
curl_close($ch);
return $response;
}
// пример использования $url = "https://example.com/api";
$data = ['foo' => 'bar', 'id' => 42];
$response = sendCompressedData($url, $data);
echo $response;
Что тут происходит
json_encode()— готовим тело запроса.gzencode()— жмём его в gzip.CURLOPT_HTTPHEADER— безContent-Encoding: gzipсервер решит, что мы сошли с ума.Accept-Encoding: gzip— чтобы и ответ прилетел сжатым (если API умеет).
Ошибки Curl — ловим руками, иначе будешь гадать, почему API молчит.
Подводные камни
- nginx/Apache могут резать gzip. Иногда прокси-сервер разворачивает тело запроса. Смотри в логи.
- Сжатие не всегда нужно. Если твой JSON на 200 байт — gzip только добавит накладные расходы.
- Ответ тоже может прийти gzipped. Тогда тебе придётся распаковать его через
gzdecode($response).
Итог
Вся магия — это одна строчка с gzencode(). Дальше всё стандартно: Curl, заголовки и проверка ошибок.
0 комментариев