Null в GET-запросе от Яндекс.Директа

Пытаюсь получить данные отчетов с помощью API Яндекс.Директа (https://api.direct.yandex.com/json/v5/reports) и получаю следующую ошибку:

Trying to get property 'result' of non-object

Мои параметры:

$params = array(
                    'SelectionCriteria' => array(
                        'DateFrom'  =>  $startDate,
                        'DateTo'    =>  $endDate,
                        'Filter'    =>  array(array(
                            'Field' =>  'CampaignId',
                            'Operator'  =>  'EQUALS',
                            'Values'    =>  array($campaign->getId())
                        ))
                    ),
                    'FieldNames'    =>  array('Date', 'CriterionId'),
                    'ReportName'    => 'Yandex actual report',
                    'ReportType'    => 'CUSTOM_REPORT',
                    'DateRangeType' => 'CUSTOM_DATE',
                    'Format'        => 'TSV',
                    'IncludeDiscount'   =>  'YES',
                    'IncludeVAT'    =>  'NO'
                );

Затем я передаю этот массив следующему методу:

$data = $this->client->call("https://api.direct.yandex.com/json/v5/reports", "get", $params);

И сама функция:

    public function call($url, $method, $params, $headers = []){
    $client = new \GuzzleHttp\Client();

    $query = [
        'method'    => $method,
        'params'    => $params
    ];

    $defHeaders = array_merge([
        'Content-type' => 'application/json; charset=utf-8',
        'Authorization'=> "Bearer ".$this->token,
    ],$headers);

    $res = $client->request('POST', $url, [
        'json' => $query,
        'headers' => $defHeaders
    ]);


    $res = json_decode($res->getBody()->getContents());

    if (isset($res->error)){
        throw new YdException($res->error->error_string, $res->error->error_code, $res->error->error_detail);
    }

    return $res->result;
}

Когда я var_dump($res), я получаю значение NULL. Так что я делаю неправильно?

«Когда я var_dump($res)» — в какой момент? Пожалуйста, не говорите после строки json_decode … потому что тогда вы, конечно, должны были проверить, что возвращает $res->getBody()->getContents() в первую очередь.
04FS 20.02.2019 12:32

В вызове функции вы определяете «GET» как метод, а в своей функции вы определяете «POST». Это намеренно? Учитывая тот факт, что вы отправляете тело с параметрами, я бы предположил, что yandex API ожидает POST...

Erik Reder 20.02.2019 12:35

@04FS Я проверил, что возвращает $res->getBody()->getContents() — он возвращает массив.

tohhy 20.02.2019 12:45

Ну, json_decode хочет, чтобы в качестве первого параметра была строка, а не массив.

04FS 20.02.2019 12:49

@04FS Та же проблема со строкой.

tohhy 20.02.2019 13:15

И что теперь означает «в строке», точно? Если у вас есть строковое значение, похожее на JSON, и вы все еще получаете null после json_decode, то следующим шагом должно быть просмотр того, что должен сказать json_last_error.

04FS 20.02.2019 13:49

@04FS мой json_last_error возвращает 4, это означает, что это JSON_ERROR_SYNTAX, верно?

tohhy 20.02.2019 13:55

да. (var_dump(JSON_ERROR_SYNTAX); может показать вам значение такой константы, когда возникает вопрос.)

04FS 20.02.2019 13:58

@04FS Если я наберу var_dump(JSON_ERROR_SYNTAX), он вернет int(4).

tohhy 20.02.2019 14:35

(Да, именно это я и имел в виду, что вы можете получить числовое значение, которое представляет эта константа, таким образом, если бы были какие-то сомнения. Это не совсем относится к вашей проблеме, поэтому не сосредотачивайтесь сейчас на этом второстепенном аспекте.)

04FS 20.02.2019 14:38

@04FS Проблема в том, что запрос возвращает формат TSV, и нет свойства с именем «результат», поэтому я получаю сообщение об ошибке.

tohhy 20.02.2019 15:10

TSV — это значения, разделенные табуляцией, это формат, похожий на CSV… понятия не имею, что заставило вас думать, что попытка использовать json_decode для этого имеет смысл даже отдаленно.

04FS 20.02.2019 15:14
Стоит ли изучать 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 и хотите разрабатывать...
1
12
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отчет возвращается в формате TSV, а не JSON. Вот поэтому и появилась эта проблема.

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