Сохранение ответа API в формате PDF - проблема с кодировкой - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь сохранить ответ REST API ( документация - только Poli sh) в виде файла PDF на сервере, используя запрос PHP curl. Следующий код дает статус ответа 200, что означает, что API предоставляет мне двоичную этикетку доставки PDF.

Проблема в том, что json_last_error_msg () сообщает: «Неверно сформированные символы UTF-8, возможно, неправильно закодированы» и файл PDF сохранен на сервере поврежден.

Я что-то делаю не так или что-то упускаю?

$url = "https://api-shipx-pl.easypack24.net/v1/shipments/314718872/label?format=Pdf&type=normal";
   
$headr[] = 'Content-type: application/json';
$headr[] = 'Authorization: Bearer '.$accesstoken; //the token is defined elsewhere ofc
   
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headr);
$json_response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
   
echo "Response status: " . $status . "<br>"; //that echoes 200
   
$response = json_decode($json_response, true);
   
echo "Error: " . json_last_error_msg() . "<br>"; //that's Malformed UTF-8...
   
$pdfData = base64_decode($json_response);
file_put_contents('some_test_label.pdf', $pdfData);

1 Ответ

1 голос
/ 16 июня 2020

Джонатан решил проблему. Рабочий код ниже:

$url = "https://api-shipx-pl.easypack24.net/v1/shipments/314718872/label?format=Pdf&type=normal";

$headr[] = 'Content-type: application/json';
$headr[] = 'Authorization: Bearer '.$accesstoken; //the token is defined elsewhere ofc

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headr);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

echo "Response status: " . $status . "<br><br>";
echo "Encoding: " . mb_detect_encoding($response) . "<br>";
echo "Error: " . json_last_error_msg() . "<br>";

file_put_contents('some_test_label.pdf', $response);
...