Создание пользователя с помощью веб-сервиса Moodle
Я попытался создать нового пользователя в Moodle с помощью api веб-службы.
Я попробовал с примером , который я нашел на github, и с другим кодом php
В обоих случаях я получаю один и тот же ответ:
" Отсутствует необходимый ключ в единой структуре: пользователи"
Ответ:
{
"exception":"invalid_parameter_exception",
"errorcode":"invalidparameter",
"message":"Invalid parameter value detected",
"debuginfo":"Missing required key in single structure: users"
}
Я пытаюсь изменить объект с помощью массива, но ошибка продолжается.
Мой код:
$functionname = 'core_user_create_users';
$user1 = new stdClass();
$user1->id = 1;
$user1->username = 'testusername1';
$user1->password = 'testpassword1';
$user1->firstname = 'testfirstname1';
$user1->lastname = 'testlastname1';
$user1->email = '[email protected]';
$user1->auth = 'manual';
$user1->idnumber = 'testidnumber1';
$user1->description = 'Hello World!';
$user1->city = 'testcity1';
$user1->country = 'BR';
$token = 'mytoken';
$domainname = 'localhost/moodle';
$functionname = 'core_user_create_users';
$restformat = 'json';
$serverurl = $domainname . '/webservice/rest/server.php'. '?wstoken=' . $token . '&wsfunction='.$functionname.'&moodlewsrestformat=' . $restformat;
$users = array($user1);
$params = array('users' => $users);
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: text/plain',
'content' => $params
)
));
$contents = file_get_contents($serverurl, null, $context);
//print_r($contents);
$resposta = json_decode($contents);
У меня есть действительный токен, и пользователю разрешено используйте функцию core_user_create_users
6 answers
Получить ту же проблему с требуемым ключом "пользователи" решить проблему с этим =>
$serverurl = $domainname . '/webservice/rest/server.php'. '?wstoken=' . $token . '&wsfunction='.$functionname;
//require_once('../curl.php');
$curl = new curl;
$params = "&users[0][username]=loginnn&users[0][password]=4815162342Qq*&users[0][firstname]=allala&users[0][lastname]=trest&users[0][email][email protected]";
//if rest format == 'xml', then we do not add the param for backward compatibility with Moodle < 2.2
$restformat = ($restformat == 'json')?'&moodlewsrestformat=' . $restformat:'';
$resp = $curl->post($serverurl . $restformat, $params);
Я думаю, что вы должны повысить уровень отладки в своей системе moodle, я надеюсь, что вы получите больше полезной информации об этой ошибке, отладка поможет вам решить точную проблему. пройдите по следующему пути:
Home ► Site administration ► Development ► Debugging
Выберите Developer level
из debug messages
и сохраните изменения
У меня однажды была похожая проблема, по моему опыту, это проблема с $user1->password = 'testpassword1';
Moodle нужен пароль с одной заглавной буквой и хотя бы одним символом, таким как /., -_ и т. Д.
Попробуйте новый пароль, возможно, он сработает...
Не передавайте идентификатор в массив пользователей, так как он не принимает его в качестве параметра. Для получения более подробной информации, пожалуйста, ознакомьтесь с документацией API WebService для создания пользователя в Moodle.
Сегодня столкнулся с такой же необходимостью, и я использовал ваш пост, чтобы получить код с GitHub, поэтому, думаю, я расскажу вам, как я исправил ошибку:
Измените свой код на следующий:
$users = array((array)$user1);
$params = array('users' => (array)$users);
Код с GitHub $user1 является объектом. Для Moodle требовался массив.
Ниже скопировано из документации Moodle.
[users] =>
Array
(
[0] =>
Array
(
[username] => string
[password] => string
[firstname] => string
[lastname] => string
[email] => string
[auth] => string
[idnumber] => string
[lang] => string
[calendartype] => string
[theme] => string
[timezone] => string
[mailformat] => int
[description] => string
[city] => string
[country] => string
[firstnamephonetic] => string
[lastnamephonetic] => string
[middlename] => string
[alternatename] => string
[preferences] =>
Array
(
[0] =>
Array
(
[type] => string
[value] => string
)
)
[customfields] =>
Array
(
[0] =>
Array
(
[type] => string
[value] => string
)
)
)
)
В нашем случае мы добавили поддержку Https, но мы все еще вызывали Http-версию URL-адреса Moodle. Переход на Https решил проблему.