Создание пользователя с помощью веб-сервиса 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

Author: Guilherme, 2013-12-18

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);
 4
Author: Андрей Горюшкин, 2017-03-16 09:19:19

Я думаю, что вы должны повысить уровень отладки в своей системе moodle, я надеюсь, что вы получите больше полезной информации об этой ошибке, отладка поможет вам решить точную проблему. пройдите по следующему пути:

Home ► Site administration ► Development ► Debugging

Выберите Developer level из debug messages и сохраните изменения

 1
Author: sumit negi, 2013-12-20 12:30:08

У меня однажды была похожая проблема, по моему опыту, это проблема с $user1->password = 'testpassword1'; Moodle нужен пароль с одной заглавной буквой и хотя бы одним символом, таким как /., -_ и т. Д.

Попробуйте новый пароль, возможно, он сработает...

 1
Author: rfcabal, 2016-09-07 14:41:22

Не передавайте идентификатор в массив пользователей, так как он не принимает его в качестве параметра. Для получения более подробной информации, пожалуйста, ознакомьтесь с документацией API WebService для создания пользователя в Moodle.

 0
Author: Ravi Tiwari, 2014-08-04 14:26:52

Сегодня столкнулся с такой же необходимостью, и я использовал ваш пост, чтобы получить код с 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                                
                            )
                    )                
            )
    )
 0
Author: Wang Peter, 2015-05-13 08:51:54

В нашем случае мы добавили поддержку Https, но мы все еще вызывали Http-версию URL-адреса Moodle. Переход на Https решил проблему.

 0
Author: Savage, 2016-08-04 18:12:18