Почему неверный json формат в ответе iikoCloud API?
Добрый день!
Столкнулся с проблемой при получении организаций с помощью API.
Код php запроса с использованием curl:
$ch = curl_init(); $availOrganizationsVars = [ 'organizationIds' => ['null'], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => ['null'] ]; $vars = json_encode($availOrganizationsVars); $headers = [ "Authorization: Bearer ".$token, "Content-Type: application/json" ]; curl_setopt($ch, CURLOPT_URL, "https://api-ru.iiko.services/api/1/organizations"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); // Post Fields curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); curl_close($ch); |
$ch = curl_init(); $availOrganizationsVars = [ 'organizationIds' => ['null'], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => ['null'] ]; $vars = json_encode($availOrganizationsVars); $headers = [ "Authorization: Bearer ".$token, "Content-Type: application/json" ]; curl_setopt($ch, CURLOPT_URL, "https://api-ru.iiko.services/api/1/organizations"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); // Post Fields curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); curl_close($ch);
Сервер отдает ошибку:
"errorDescription": "Body has invalid JSON format.", "error": "INVALID_BODY_JSON_FORMAT"
пробовал разные варианты:
1. посылать пустой объект в json
$empty = json_decode ("{}"); $vars= json_encode($empty); |
$empty = json_decode ("{}"); $vars= json_encode($empty);
2. вариант где null не строчное значение
$availOrganizationsVars = [ 'organizationIds' => [null], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => [null] ]; $vars = json_encode($availOrganizationsVars); |
$availOrganizationsVars = [ 'organizationIds' => [null], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => [null] ]; $vars = json_encode($availOrganizationsVars);
3. вариант без массива
$availOrganizationsVars = [ 'organizationIds' => null, 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => null ]; $vars = json_encode($availOrganizationsVars); |
$availOrganizationsVars = [ 'organizationIds' => null, 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => null ]; $vars = json_encode($availOrganizationsVars);
и т.д.
При это, аналогичный запрос выше, на получение токена авторизации работает как должно:
$logIn = ['apiLogin' => '#####']; $vars = json_encode($logIn); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api-ru.iiko.services/api/1/access_token"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); // Post Fields curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = [ "Content-Type: application/json; charset=UTF-8" ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $server_output = curl_exec($ch); curl_close($ch); |
$logIn = ['apiLogin' => '#####']; $vars = json_encode($logIn); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api-ru.iiko.services/api/1/access_token"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); // Post Fields curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = [ "Content-Type: application/json; charset=UTF-8" ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $server_output = curl_exec($ch); curl_close($ch);
пример из документации:
а вот мой json, который я отправляю в теле запроса:
{
"organizationIds":[
"null"
],
"returnAdditionalInfo":true,
"includeDisabled":true,
"returnExternalData":[
"null"
]
}
Дополнительно:
Вероятно в nullable нужно передавать
"organizationIds":null,,
а не
"organizationIds":[ "null" ], |
"organizationIds":[ "null" ],
Аналогично для returnExternalData
3. вариант без массива
curl_setopt($ch, CURLOPT_POST, 1);
{ "organizationIds":[ "null" ], "returnAdditionalInfo":true, "includeDisabled":true, "returnExternalData":[ "null" ] } |
{ "organizationIds":[ "null" ], "returnAdditionalInfo":true, "includeDisabled":true, "returnExternalData":[ "null" ] }
Ошибка не означает что ваш JSON-не валидный, это может быть просто ошибка валидации данных. Они ожидают в organizationIds массив валидных uuid-строк и тд.
Передавайте не "null", а валидные данные.
А так гадать нет смысла, обычно любой такой сервис предоставляет тех поддержку куда стоит направлять подобные запросы. Но думаю они скажут, в первую очередь, шлите правильные данные в запросе, а не непонятный "null".
а в документации сказано:
organizationIds:
Array of strings Nullable
Organizations IDs which have to be returned. By default - all organizations from apiLogin.
Обращение в ТП тоже результатов не дало
Ответы:
Content-Type: application/json; charset=UTF-8
Попробуйте
- пробовал, результат тот же
- а их пример из документации работает?
- pantsarny, нет возможности проверить т.к. у них указан рандомный ИД организации, который не совпадает c ИД моих организаций
пробовал их вариант, получаю ту же ошибку
- Но можно же получить ошибку, и понять распарсился ли json
- pantsarny, пробовал вариант из документации, получаю ту же ошибку
"errorDescription": "Body has invalid JSON format.", "error": "INVALID_BODY_JSON_FORMAT"
Попробуйте эксперимента ради вместо;
$availOrganizationsVars = [ 'organizationIds' => ['null'], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => ['null'] ]; |
$availOrganizationsVars = [ 'organizationIds' => ['null'], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => ['null'] ];
Вот так:
$availOrganizationsVars = [ 'organizationIds' => [], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => [] ]; |
$availOrganizationsVars = [ 'organizationIds' => [], 'returnAdditionalInfo' => true, 'includeDisabled' => true, 'returnExternalData' => [] ];
Если не поможет - то вообще уберите их:
$availOrganizationsVars = [ 'returnAdditionalInfo' => true, 'includeDisabled' => true, ]; |
$availOrganizationsVars = [ 'returnAdditionalInfo' => true, 'includeDisabled' => true, ];
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Проблема с неверным форматом JSON в ответе API iikoCloud может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:
1. Некорректный синтаксис JSON: Проверьте, что ваш JSON соответствует стандарту и не содержит ошибок в синтаксисе. Даже небольшая опечатка может привести к невалидному JSON.
```php
{ "key": "value", "key2": "value2" }
```
2. Некорректное кодирование данных: Убедитесь, что данные, которые вы отправляете в запросе, правильно закодированы в JSON формат. Например, если вы отправляете строку, убедитесь, что она заключена в кавычки.
```php
{ "name": "John Doe", "age": 30 }
```
3. Неправильный тип содержимого заголовка запроса: Убедитесь, что вы установили правильный заголовок "Content-Type" в вашем запросе. Для JSON данные должен быть установлен тип "application/json".
```php
$headers = array( 'Content-Type: application/json' );
```
4. Некорректная обработка ответа: Проверьте, как вы обрабатываете ответ от API. Убедитесь, что вы правильно парсите JSON ответ и обрабатываете его данные.
```php
$response = json_decode($json_response, true); if ($response === null) { echo 'Ошибка при парсинге JSON'; }
```
При соблюдении всех вышеперечисленных рекомендаций ваш запрос к API iikoCloud должен быть успешным и вы получите корректный JSON ответ. Если проблема все еще остается, обратитесь к документации API или к службе поддержки для получения более подробной информации о возможных причинах ошибки.