Жрать HTTP, не могу разобрать ответ на JSON

Итак, я интегрирую 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
hassan 19.03.2018 11:19

Синтаксическая ошибка. Спасибо

Borjante 19.03.2018 11:20

нет, я имею в виду отладить вашу ошибку декодирования с помощью json_last_error :)

hassan 19.03.2018 11:20

Похоже, вам нужно избавиться от косых черт перед json_decode-ing. Что произойдет, если вы сделаете $content = json_decode(stripslashes($response->getBody()->getContents()‌​));?

N.B. 19.03.2018 11:21

Спасибо N.B, лучше, чем preg_replace

Borjante 19.03.2018 11:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
3 408
2

Ответы 2

Итак, наконец нашел это: Удалите обратную косую черту \ из строки, используя предварительную замену 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.

Я не уверен, что это решит вашу проблему, просто сделайте все ясно и правильно;)

Другие вопросы по теме