Я попытался создать нового пользователя в 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 = 'testemail1@moodle.com'; $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
получить такую же проблему с требуемыми ключевыми «пользователями» решить проблему с этим =>
$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]=ty@mail.ru"; //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);
У меня есть аналогичная проблема один раз, по моему опыту есть проблема с $user1->password = 'testpassword1';
Moodle нужен пароль с одной заглавной буквой и, по крайней мере, одним символом вроде /. , – _ и т.д.
попробуйте новый пароль, возможно, он работает …
Я думаю, что вы должны повысить уровень отладки в вашей системе moodle, надеюсь, вы получите более полезную информацию об этой ошибке, отладка поможет вам достичь точной проблемы. выполните следующий путь:
Home ► Site administration ► Development ► Debugging
выберите Developer level
из debug messages
и сохраните изменения
Не передавайте идентификатор в массив пользователя, так как он не принимает его в качестве параметра. Для получения дополнительной информации ознакомьтесь с документацией 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 решил проблему.