Как правильно оформить rest-запрос?
Здравствуйте!
Тестировал API Почты РФ с помощью SoapUI (Нормализация адреса).
Обязательные условия:
1. Указание 4 заголовков (Authorization, Accept, X-User-Authorization, Content-Type)
2. Тело запроса выглядит примерно так:
Теперь решил перенести это в плагин Modx. Но вот теперь вопрос, а как указать заголовки?
У меня есть один отлично работающий php-скрипт на сайте, в котором ведется расчет с помощью tariff.pochta.ru и код построения запроса выглядит так ($input задается выше):
upd.
Все получилось, в итоге код выглядит так:
Тестировал 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();
Комментарии: 7
И 500-ая ошибка говорит, что…
В журнале ошибки
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
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
Попробуйте передавать заголовки не во время getService, а ниже через метод setHeaders
так?
$response = $client->post($api_url, $addressTo, $headers)->process();
пробовал — все такая же ситуация
Теперь ответ легко находится. Класс не найден. Почему? Потому что в третьем параметре метода getService, в котором должен быть указан путь к классу (для классов MODX указывается пустое значение), указан массив заголовков, который должен быть указан в четвёртом параметре.
теперь я указал вот так
Вот текущий код:
$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, а в журналах ничего
Стоило заглянуть в modrest.class.php и стала понятна ошибка))
Параметры могут быть только типа array, а я передавал в json.
Вопрос: если в параметре указать format json, то он эти параметры автоматически в json переводит?
Параметры могут быть только типа array, а я передавал в json.
Вопрос: если в параметре указать format json, то он эти параметры автоматически в json переводит?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.