Diferència entre revisions de la pàgina «Moodle API»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(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
  
Ai! però dona un error.
+
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

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:

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:

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:

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ó.