Как правильно оформить rest-запрос?

Здравствуйте!
Тестировал API Почты РФ с помощью SoapUI (Нормализация адреса).
Обязательные условия:
1. Указание 4 заголовков (Authorization, Accept, X-User-Authorization, Content-Type)
2. Тело запроса выглядит примерно так:
[
    {
        "id": "adr 1",
        "original-address": "Москва, Варшавское шоссе, 37"
    },
    {
        "id": "adr 2",
        "original-address": "ул. Мясницкая, д. 26, г. Москва, 1"
    }
]
Все отлично работает.
Теперь решил перенести это в плагин Modx. Но вот теперь вопрос, а как указать заголовки?

У меня есть один отлично работающий php-скрипт на сайте, в котором ведется расчет с помощью tariff.pochta.ru и код построения запроса выглядит так ($input задается выше):
$client = $modx->getService('rest', 'rest.modRest');
$client->setOption('format', 'json');
$client->setOption('suppressSuffix', 'true');
$api = 'https://tariff.pochta.ru/v2/calculate/tariff/delivery?';
$response = $client->get($api, $input)->process();
Скопировал данный код, добавил заголовки и сменил метод с get на post и в итоге получаю 500 ошибку:
$addressTo = '[{"id": "adr 1","original-address": "127253, г Москва, ул Слепнёва, д 1"}]';
$headers =  array(
"Authorization" => "AccessToken тут токен",
"X-User-Authorization" => "Basic тут ключ",
"Content-type" => "application/json;charset=UTF-8",
"Accept" => "application/json"
);
$client = $modx->getService('rest', 'rest.modRest', array('headers' => $headers));
$client->setOption('format', 'json');
$api = 'https://otpravka-api.pochta.ru/1.0/clean/address';
$response = $client->post($api, $addressTo)->process();
Знатоки, подскажите пожалуйста, как правильно оформить? Уже четверть дня потратил и все не могу понять как оформить?

upd.
Все получилось, в итоге код выглядит так:
$headers =  array(
    "Authorization" => "AccessToken тут токен",
    "X-User-Authorization" => "Basic тут ключ",
    "Content-type" => "application/json;charset=UTF-8",
    "Accept" => "application/json"
);
$client = $modx->getService('rest', 'rest.modRest');
$client->setOption('format', 'json_post');
$client->setOption('suppressSuffix', 'true');
$api_url = 'https://otpravka-api.pochta.ru/1.0/clean/address';
$response = $client->post($api_url, $data, $headers)->process();
Lori
07 ноября 2021, 17:17
modx.pro
888
0

Комментарии: 7

Сергей Шлоков
08 ноября 2021, 07:29
0
И 500-ая ошибка говорит, что…
    Lori
    08 ноября 2021, 10:24
    0
    В журнале ошибки
    Could not load class: modRest from rest.modrest.
    Problem getting service rest, instance of class rest.modRest, from path Array


    Честно, не понимаю почему. Практически такой же синтаксис, но на другой апи и с указанием заголовков. Либо я заголовки неправильно указываю, хотя по доке так docs.modx.com/3.x/ru/extending-modx/services/modrest#zapis-v-header
      Николай Савин
      08 ноября 2021, 10:31
      0
      Попробуйте передавать заголовки не во время getService, а ниже через метод setHeaders
        Lori
        08 ноября 2021, 10:35
        0
        так?
        $response = $client->post($api_url, $addressTo, $headers)->process();
        пробовал — все такая же ситуация
        Сергей Шлоков
        08 ноября 2021, 10:36
        0
        Теперь ответ легко находится. Класс не найден. Почему? Потому что в третьем параметре метода getService, в котором должен быть указан путь к классу (для классов MODX указывается пустое значение), указан массив заголовков, который должен быть указан в четвёртом параметре.
          Lori
          08 ноября 2021, 10:43
          0
          теперь я указал вот так
          $response = $client->post($api_url, $addressTo, $headers)->process();
          и все равно 500 статус запроса. В журнале тишина. Или такой синтаксис тоже неверный?

          Вот текущий код:
          $data = array(
          "id" => "adr 1",
          "original-address" => "127253, г Москва, ул Слепнёва, д 1"
          );
          $addressTo = '['.json_encode($data).']';
          $headers =  array(
          "Authorization" => "AccessToken тут токен",
          "X-User-Authorization" => "Basic тут ключ",
          "Content-type" => "application/json;charset=UTF-8",
          "Accept" => "application/json"
          );
          $client = $modx->getService('rest', 'rest.modRest');
          $client->setOption('format', 'json');
          $client->setOption('header', true);
          $client->setOption('suppressSuffix', 'true');
          $api = 'https://otpravka-api.pochta.ru/1.0/clean/address';
          $response = $client->post($api, $addressTo, $headers)->process();
          p.s я думал лог ошибок будет писаться в журнал сервера, а ошибки по данному запросу отображаются в журнале modx. вот сейчас во вкладке network вижу статус 500, а в журналах ничего
            Lori
            08 ноября 2021, 11:58
            +1
            Стоило заглянуть в modrest.class.php и стала понятна ошибка))
            Параметры могут быть только типа array, а я передавал в json.
            Вопрос: если в параметре указать format json, то он эти параметры автоматически в json переводит?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7