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

De Cacauet Wiki
Salta a la navegació Salta a la cerca
 
(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)
== Custom functions ==
+
* http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module (mirar la resposta)
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.
+
O sigui que els paràmetres s'han de passar en URLencode a l'estil:
http://stackoverflow.com/questions/38891022/moodle-custom-service-creation-issue
+
.....&criteria[0][key]=email&criteria[0][value]=aname@somedomain
 
 
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 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ó.