Пытаюсь получить данные отчетов с помощью 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. Так что я делаю неправильно?
В вызове функции вы определяете «GET» как метод, а в своей функции вы определяете «POST». Это намеренно? Учитывая тот факт, что вы отправляете тело с параметрами, я бы предположил, что yandex API ожидает POST...
@04FS Я проверил, что возвращает $res->getBody()->getContents() — он возвращает массив.
Ну, json_decode хочет, чтобы в качестве первого параметра была строка, а не массив.
@04FS Та же проблема со строкой.
И что теперь означает «в строке», точно? Если у вас есть строковое значение, похожее на JSON, и вы все еще получаете null после json_decode, то следующим шагом должно быть просмотр того, что должен сказать json_last_error.
@04FS мой json_last_error возвращает 4, это означает, что это JSON_ERROR_SYNTAX, верно?
да. (var_dump(JSON_ERROR_SYNTAX); может показать вам значение такой константы, когда возникает вопрос.)
@04FS Если я наберу var_dump(JSON_ERROR_SYNTAX), он вернет int(4).
(Да, именно это я и имел в виду, что вы можете получить числовое значение, которое представляет эта константа, таким образом, если бы были какие-то сомнения. Это не совсем относится к вашей проблеме, поэтому не сосредотачивайтесь сейчас на этом второстепенном аспекте.)
@04FS Проблема в том, что запрос возвращает формат TSV, и нет свойства с именем «результат», поэтому я получаю сообщение об ошибке.
TSV — это значения, разделенные табуляцией, это формат, похожий на CSV… понятия не имею, что заставило вас думать, что попытка использовать json_decode для этого имеет смысл даже отдаленно.






Отчет возвращается в формате TSV, а не JSON. Вот поэтому и появилась эта проблема.
$res->getBody()->getContents()в первую очередь.