Итак, я интегрирую API от сторонней компании и сталкиваюсь с этой странной ситуацией.
Я получаю конечную точку с помощью следующего кода
$client = $this->client = new Client([
'base_uri' => 'https://xxx.xxxxxxxxxx.com/api/',
'timeout' => 15
]);
$this->requestConfig = [
'auth' => [
'[email protected]',
'xxxxx'
],
'headers' => [
'cache-control' => 'no-cache',
'content-type' => 'application/x-www-form-urlencoded'
],
];
$response = $this->client->get($url, $this->requestConfig);
$content = $response->getBody()->getContents();
Теперь самое интересное, если я использую var_dump content, я получаю:
string(66) ""[{\"ExternalId\":\"38\",\"AgencyReference\":\"45436070356676\"}]""
Теперь я знаю, что этот ответ плохой, тип ответа, если не установлен json, json закодирован по URL и все плохо пахнет.
Некоторое время я пытался разобрать эту строку.
urldecode тоже не работает.
Вопрос простой, учитывая такой ответ, как мне получить нормальный массив?
В настоящее время используется PHP 7.1
Синтаксическая ошибка. Спасибо
нет, я имею в виду отладить вашу ошибку декодирования с помощью json_last_error :)
Похоже, вам нужно избавиться от косых черт перед json_decode-ing. Что произойдет, если вы сделаете $content = json_decode(stripslashes($response->getBody()->getContents()));?
Спасибо N.B, лучше, чем preg_replace






Итак, наконец нашел это: Удалите обратную косую черту \ из строки, используя предварительную замену php
Чтобы решить мою проблему.
В данном случае это было то, что экранированные кавычки искажали файл json. Мой последний код выглядит так.
$response = $response->getBody()->getContents();
$clean = stripslashes($response);
$clean = substr($clean, 1, -1);
dd(json_decode($clean));
Пожалуйста, никогда не пишите свой API вот так ...
Просто ужасно выглядит
Кстати, Content-Type имеет смысл, когда вы отправляете (в запросе или ответе) некоторый контент. Но вы отправляете запрос GET, у которого нет содержимого.
А чтобы указать предпочтительный тип содержимого для ответа, вы должны использовать HTTP-заголовок Accept, например Accept: application/json.
Я не уверен, что это решит вашу проблему, просто сделайте все ясно и правильно;)