可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have tried to create a new user on the Moodle by web service api.
I tried with a example that i found on the github and with another php code
In the both i receive the same response:
"Missing required key in single structure: users"
the response:
{ "exception":"invalid_parameter_exception", "errorcode":"invalidparameter", "message":"Invalid parameter value detected", "debuginfo":"Missing required key in single structure: users" }
I try to change the object by a array, but the error continues.
my code:
$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);
I have a valid token and the user is allowed to use the core_user_create_users
function
回答1:
get same problem with required key 'users' solve problem with this =>
$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);
回答2:
I think You must high the debugging level in your moodle system, I hope you will get more useful information regarding this error, debugging will help you to reach the exact problem. go through following path:
choose Developer level
from the debug messages
and save the changes
回答3:
I have a similar problem once, in my experience is a problema with $user1->password = 'testpassword1';
Moodle needs a password with one uppercase letter and at least one simbol like / . , - _ etc.
try a new password maybe it works...
回答4:
Do not pass the ID into the user array, as it doesn't accept it as a parameter. For more details, please read the WebService API documentation for creating a user in Moodle.
回答5:
came across the same need today and I used your post to get the code from GitHUB so I guess I'd tell you how I fixed the error:
change your code to the following:
$users = array((array)$user1); $params = array('users' => (array)$users);
The code from GitHUB $user1 is an object. Moodle required an Array.
Below is copied from Moodle's documentation.
[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 ) ) ) )
回答6:
In our case, we added Https support, but we were still calling the Http version of the Moodle url. Changing to Https solved the problem.