Почему неверный json формат в ответе iikoCloud API?

Ссылка скопирована
PHP
1 ответ

Добрый день!

Столкнулся с проблемой при получении организаций с помощью 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 формат в ответе iikoCloud API?

а вот мой json, который я отправляю в теле запроса:

{
"organizationIds":[
"null"
],
"returnAdditionalInfo":true,
"includeDisabled":true,
"returnExternalData":[
"null"
]
}

Дополнительно:

Вероятно в nullable нужно передавать
"organizationIds":null,,
а не

"organizationIds":[ "null" ],

"organizationIds":[ "null" ],

Аналогично для returnExternalData

  • Геннадий, см.

    3. вариант без массива

  • Adamos, ну тогда чуваку выдергивать данные из $vars и postman ему в помощь.
  • Попробуй убрать
    curl_setopt($ch, CURLOPT_POST, 1);
  • Технически всё правильно. Вариант где такой json шлёте соответствует примеру из документации.
    { "organizationIds":[ "null" ], "returnAdditionalInfo":true, "includeDisabled":true, "returnExternalData":[ "null" ] }

    { "organizationIds":[ "null" ], "returnAdditionalInfo":true, "includeDisabled":true, "returnExternalData":[ "null" ] }

    Ошибка не означает что ваш JSON-не валидный, это может быть просто ошибка валидации данных. Они ожидают в organizationIds массив валидных uuid-строк и тд.
    Передавайте не "null", а валидные данные.

    А так гадать нет смысла, обычно любой такой сервис предоставляет тех поддержку куда стоит направлять подобные запросы. Но думаю они скажут, в первую очередь, шлите правильные данные в запросе, а не непонятный "null".

  • nokimaro, в том то и дело, у меня нет этих данных, я пытаюсь их получить (в частности organizationIds).

    а в документации сказано:

    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, ];

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Проблема с неверным форматом JSON в ответе API iikoCloud может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:

    1. Некорректный синтаксис JSON: Проверьте, что ваш JSON соответствует стандарту и не содержит ошибок в синтаксисе. Даже небольшая опечатка может привести к невалидному JSON.

    ```php

    {
      "key": "value",
      "key2": "value2"
    }

    { "key": "value", "key2": "value2" }

    ```

    2. Некорректное кодирование данных: Убедитесь, что данные, которые вы отправляете в запросе, правильно закодированы в JSON формат. Например, если вы отправляете строку, убедитесь, что она заключена в кавычки.

    ```php

    {
      "name": "John Doe",
      "age": 30
    }

    { "name": "John Doe", "age": 30 }

    ```

    3. Неправильный тип содержимого заголовка запроса: Убедитесь, что вы установили правильный заголовок "Content-Type" в вашем запросе. Для JSON данные должен быть установлен тип "application/json".

    ```php

    $headers = array(
      'Content-Type: application/json'
    );

    $headers = array( 'Content-Type: application/json' );

    ```

    4. Некорректная обработка ответа: Проверьте, как вы обрабатываете ответ от API. Убедитесь, что вы правильно парсите JSON ответ и обрабатываете его данные.

    ```php

    $response = json_decode($json_response, true);
    if ($response === null) {
      echo 'Ошибка при парсинге JSON';
    }

    $response = json_decode($json_response, true); if ($response === null) { echo 'Ошибка при парсинге JSON'; }

    ```

    При соблюдении всех вышеперечисленных рекомендаций ваш запрос к API iikoCloud должен быть успешным и вы получите корректный JSON ответ. Если проблема все еще остается, обратитесь к документации API или к службе поддержки для получения более подробной информации о возможных причинах ошибки.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно