Вызов веб-сервиса Moodle с использованием Unirest

Я хочу общаться с установкой Moodle 2.9.

Следующий пример клиента представляет собой небольшую модификацию:
https://github.com/moodlehq/sample-ws-clients/blob/master/PHP-REST/client.php
использовать Unirest вместо Curl и JSON вместо XML:

        $token = 'd1c74d6466daaaaad59b5d99906bfc84';
$domainname = 'http://moodle.example.com';
$functionname = 'core_user_create_users';
// REST RETURNED VALUES FORMAT
$restformat = 'json';

$user1 = new \stdClass();
$user1->username = 'testusername1';
$user1->password = 'testpassword1';
$user1->firstname = 'testfirstname1';
$user1->lastname = 'testlastname1';
$user1->email = '[email protected]';
$user1->auth = 'manual';
$user1->idnumber = 'testidnumber1';
$user1->lang = 'en';
$user1->theme = 'standard';
$user1->timezone = '-12.5';
$user1->mailformat = 0;
$user1->description = 'Hello World!';
$user1->city = 'testcity1';
$user1->country = 'au';
$preferencename1 = 'preference1';
$preferencename2 = 'preference2';
$user1->preferences = array(
array('type' => $preferencename1, 'value' => 'preferencevalue1'),
array('type' => $preferencename2, 'value' => 'preferencevalue2'));

$user2 = new \stdClass();
$user2->username = 'testusername2';
$user2->password = 'testpassword2';
$user2->firstname = 'testfirstname2';
$user2->lastname = 'testlastname2';
$user2->email = '[email protected]';
$user2->timezone = 'Pacific/Port_Moresby';
$users = array($user1, $user2);
$params = array('users' => $users);
/// REST CALL

$serverurl = $domainname . '/webservice/rest/server.php' . '?wstoken=' . $token . '&wsfunction=' . $functionname;

//if rest format == 'xml', then we do not add the param for backward compatibility with Moodle < 2.2
$restformat = ($restformat == 'json') ? '&moodlewsrestformat=' . $restformat : '';
$headers = array('Accept' => 'application/json');
$response = UnirestRequest::post($serverurl . $restformat, $headers, json_encode($params));

При исполнении я получил ошибку:

«Примечание: преобразование массива в строку»

, якобы из-за параметров, идущих в теле. Итак, я решил, что мне нужно сериализовать тело перед отправкой, но когда я попытался:

$response = UnirestRequest::post($serverurl . $restformat, $headers, json_encode($params));

Я вернулся из Moodle:

{ «Исключение»: «invalid_parameter_exception», «ErrorCode»: «invalidparameter», «сообщение»: «Detectado
valor de par \ u00e1metro no v \ u00e1lido «,» debuginfo «:» Отсутствует обязательно
ключ в единой структуре: пользователи «} ◀»

Должно быть что-то, чего я не понимаю, как именно должен выглядеть запрос POST. Любое предложение?

0

Решение

Moodle ожидает, что тело сообщения будет закодировано в URL, поэтому ваше тело должно быть построено
с помощью http_build_query($params) (или любой другой метод кодирования ваших данных), например:

 $convertedpostdata = implode('&', $params);//where $params is  an array

Что касается того, почему, я действительно не помню, я помню, как боролся с реализацией некоторое время назад, вы можете просмотреть
[your_moodle_installation.com]/admin/webservice/documentation.php для дополнительной документации, кроме того, вот вам пример того, что я сделал:

https://gist.github.com/Scott972/5d9e9495c1397a2ad728b66288ce1d42

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]