Diferència entre revisions de la pàgina «Moodle API»
(Es crea la pàgina amb «El CMS Moodle disposa d'una API per accedir a les seves funcions internes i afegir funcionalitat com, per exemple, crear cursos automàticament des d'un script...».) |
|||
(Hi ha 4 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 1: | Línia 1: | ||
+ | |||
+ | == Introducció == | ||
El [[CMS]] Moodle disposa d'una [[API]] per accedir a les seves funcions internes i afegir funcionalitat com, per exemple, crear cursos automàticament des d'un script. | El [[CMS]] Moodle disposa d'una [[API]] per accedir a les seves funcions internes i afegir funcionalitat com, per exemple, crear cursos automàticament des d'un script. | ||
Línia 12: | Línia 14: | ||
https://docs.moodle.org/dev/Creating_a_web_service_client | https://docs.moodle.org/dev/Creating_a_web_service_client | ||
− | + | Tot sembla senzill en un principi, però hi ha lio per passar els arguments. Seria d'agrair passar-los en JSON o similars, però es veu que la cosa no va així. Buscant per aquí i per allà he trobat aquestes explicacions amagades: | |
+ | * https://moodle.org/mod/forum/discuss.php?d=232130 (mirar el 3r post on ho aclareix) | ||
+ | * http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module (mirar la resposta) | ||
+ | |||
+ | O sigui que els paràmetres s'han de passar en URLencode a l'estil: | ||
+ | .....&criteria[0][key]=email&criteria[0][value]=aname@somedomain | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == PHP == | ||
+ | He utilitzat aquests recursos: | ||
+ | * Llibreria una mica adaptada pel Moodle per facilitar les crides CURL: https://github.com/moodlehq/sample-ws-clients/blob/master/PHP-REST/curl.php | ||
+ | * http://stackoverflow.com/questions/33404353/php-create-user-in-moodle-via-webservice | ||
+ | |||
+ | Aquest codi m'ha funcionat amb Moodle 2.9: | ||
+ | <syntaxhighlight lang="php"> | ||
+ | |||
+ | <?php | ||
+ | require_once("curl.php"); | ||
+ | |||
+ | $courses=array("courses" => | ||
+ | array( | ||
+ | 0=>array( | ||
+ | "fullname" => "CURS DE TEST2", | ||
+ | "shortname" => "test2", | ||
+ | "categoryid" => 4 | ||
+ | ) | ||
+ | ) | ||
+ | ); | ||
+ | |||
+ | // prep url call | ||
+ | $token = "xxxyyyzzz"; | ||
+ | $server = "https://el.meu.moodle.com/webservice/rest/server.php"; | ||
+ | $getparams = "?wstoken=".$token."&wsfunction=core_course_create_courses"; | ||
+ | $url = $server.$getparams; | ||
+ | $params = $courses; | ||
+ | |||
+ | // exec | ||
+ | $curl = new curl(); | ||
+ | $resp = $curl->post($url, $params); | ||
+ | var_dump($resp); | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == Python == | ||
+ | Recursos: | ||
+ | * http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module | ||
+ | * Utilitzem la llibreria "requests" per facilitar: http://docs.python-requests.org | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | |||
+ | import requests | ||
+ | import json | ||
+ | |||
+ | token = "xxxyyyzzz" | ||
+ | url = "https://el.meu.moodle.com/moodle/webservice/rest/server.php?wstoken=" + token + "" | ||
+ | # afegir aixo si vols resposta json | ||
+ | #url=url+"&moodlewsrestformat=json" | ||
+ | |||
+ | # dades minimes per crear un curs | ||
+ | data = { | ||
+ | 'wsfunction': 'core_course_create_courses', | ||
+ | 'courses[0][fullname]' : "CURS DE TEST 3", | ||
+ | 'courses[0][shortname]' : "test3", | ||
+ | 'courses[0][categoryid]' : 4 | ||
+ | } | ||
+ | |||
+ | r = requests.post(url, params=data, verify=False) | ||
+ | |||
+ | print data | ||
+ | print r.text | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == Custom functions == | ||
+ | Això només cal si hem fet funcions personalitzades dins el moodle. Per la API estàndard no cal. | ||
+ | |||
+ | Típicament dóna un error. | ||
Can not find data record in database table external_functions. | Can not find data record in database table external_functions. | ||
Línia 21: | Línia 104: | ||
Un cop fet l'upgrade simulat, tindrem disponible la nova funció. | Un cop fet l'upgrade simulat, tindrem disponible la nova funció. | ||
+ | |||
+ | <br> |
Revisió de 14:58, 3 maig 2017
Contingut
Introducció[modifica]
El CMS Moodle disposa d'una API per accedir a les seves funcions internes i afegir funcionalitat com, per exemple, crear cursos automàticament des d'un script.
La API és accessible de diferents maneres (SOAP, REST, etc.) de les quals ens interessa REST.
Per activar-la haurem de seguir les passes (són unes quantes) que s'indica dintre del mateix moodle, a la secció:
Site Administration -> Plugins -> Web Services -> Overview
Un cop hagueu creat un rol i usuari amb els permisos adequats per a la API, finalment podeu seguir les passes descrites a la web per accedir a la API:
- Demanar token
- Executar funció
Explicat aquí:
https://docs.moodle.org/dev/Creating_a_web_service_client
Tot sembla senzill en un principi, però hi ha lio per passar els arguments. Seria d'agrair passar-los en JSON o similars, però es veu que la cosa no va així. Buscant per aquí i per allà he trobat aquestes explicacions amagades:
- https://moodle.org/mod/forum/discuss.php?d=232130 (mirar el 3r post on ho aclareix)
- http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module (mirar la resposta)
O sigui que els paràmetres s'han de passar en URLencode a l'estil:
.....&criteria[0][key]=email&criteria[0][value]=aname@somedomain
PHP[modifica]
He utilitzat aquests recursos:
- Llibreria una mica adaptada pel Moodle per facilitar les crides CURL: https://github.com/moodlehq/sample-ws-clients/blob/master/PHP-REST/curl.php
- http://stackoverflow.com/questions/33404353/php-create-user-in-moodle-via-webservice
Aquest codi m'ha funcionat amb Moodle 2.9:
<?php
require_once("curl.php");
$courses=array("courses" =>
array(
0=>array(
"fullname" => "CURS DE TEST2",
"shortname" => "test2",
"categoryid" => 4
)
)
);
// prep url call
$token = "xxxyyyzzz";
$server = "https://el.meu.moodle.com/webservice/rest/server.php";
$getparams = "?wstoken=".$token."&wsfunction=core_course_create_courses";
$url = $server.$getparams;
$params = $courses;
// exec
$curl = new curl();
$resp = $curl->post($url, $params);
var_dump($resp);
Python[modifica]
Recursos:
- http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module
- Utilitzem la llibreria "requests" per facilitar: http://docs.python-requests.org
import requests
import json
token = "xxxyyyzzz"
url = "https://el.meu.moodle.com/moodle/webservice/rest/server.php?wstoken=" + token + ""
# afegir aixo si vols resposta json
#url=url+"&moodlewsrestformat=json"
# dades minimes per crear un curs
data = {
'wsfunction': 'core_course_create_courses',
'courses[0][fullname]' : "CURS DE TEST 3",
'courses[0][shortname]' : "test3",
'courses[0][categoryid]' : 4
}
r = requests.post(url, params=data, verify=False)
print data
print r.text
Custom functions[modifica]
Això només cal si hem fet funcions personalitzades dins el moodle. Per la API estàndard no cal.
Típicament dóna un error.
Can not find data record in database table external_functions.
Es veu que passa quan creem una nova funció personalitzada a la API. Cal actualitzar unes taules, i això no passa automàticament.
Per forçar l'actualització de les funcions aquí suggereixen elevar la versió de version.php i així el moodle automàticament farà un upgrade.
http://stackoverflow.com/questions/38891022/moodle-custom-service-creation-issue
Un cop fet l'upgrade simulat, tindrem disponible la nova funció.