Moodle API: Diferència entre les revisions

De Cacauet Wiki
Dreceres ràpides: navegació, cerca
(PHP)
(Introducció)
 
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren)
Línia 14: Línia 14:
 
  https://docs.moodle.org/dev/Creating_a_web_service_client
 
  https://docs.moodle.org/dev/Creating_a_web_service_client
  
<br>
+
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)
  
== Custom functions ==
+
O sigui que els paràmetres s'han de passar en URLencode a l'estil:
Això només cal si hem fet funcions personalitzades dins el moodle. Per la API estàndard no cal.
+
  .....&criteria[0][key]=email&criteria[0][value][email protected]
 
+
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ó.
+
  
 
<br>
 
<br>
Línia 69: Línia 61:
  
 
== Python ==
 
== 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.
 +
 +
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ó.
  
 
<br>
 
<br>

Revisió de 15: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][email protected]


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