source: spip-zone/_plugins_/http/action/api_http.php @ 54581

Last change on this file since 54581 was 54581, checked in by rastapopoulos@…, 9 years ago

Deux nouveaux plugins dont l'un utilise l'autre.

HTTP :
=====
C'est une API très générique, définissant un serveur HTTP *abstrait*. Autrement dit, le but est de gérer les méthodes HTTP sur cette URL : http://site/http.api/implémentation/autrechose.
Une fois qu'on a appelé cette URL avec une méthode connue (sinon 404) le plugin redirige vers une *implémentation* du protocole.

Le premier élément dans l'URL correspond au *nom* de l'implémentation (par exemple "atom").
Le deuxième élément correspond habituellement au nom d'une collection (des "patates").
Tout ce qui suit correspond à l'identification d'une ressource (ça peut souvent être juste un identifiant numérique mais ça pourrait être n'importe quoi comme vous voulez !).

Exemple : http://site/http.api/atom/patates/1234

Suivant le contenu de l'URL le plugin redirige vers une *fonction* de l'implémentation : http_<implémentation>_<méthode>_<cequiestdemandé>_dist() dans le fichier "http/implementation.php"

<méthode> correspond au nom de la méthode HTTP en minuscule.
<cequiestdemandé> correspond à "index", "collection", ou "ressource" suivant le contenu de l'URL.
Par exemple pour du GET tout simple :

APP :
====
Ceci est une première implémentation du plugin HTTP. Le but est de créer un serveur APP (Atom Publishing Protocol).

Attention, là encore il s'agit d'une couche *abstraite*. C'est un *outil* pour développeur qui ensuite doivent implémenter la lecture et l'écriture au format "Atom", objet par objet.

Comme c'est loin d'être terminé, je ne sais pas encore, mais par exemple pour la lecture, il s'agit pour l'instant de créer un squelette "http/atom/patates.html" qui contient le <feed>. C'est un peu brut de décofrage pour l'instant, ça se précisera petit à petit.

Note :
=====
Ces deux plugins sont uniquement *expérimentaux*, et pour l'instant je n'ai commencé que la méthode "GET" pour les deux. Ceux qui veulent s'amuser avec sont les bienvenus !

File size: 1.8 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/*
7 * Porte d'entrée des API lecture/écriture orientés REST
8 * Cette action gère donc la partie "serveur HTTP" en redirigeant les méthodes (GET, PUT, etc) vers les fonctions spécifiques
9 *
10 * http://www.site.tld/rest.api/atom/patates => feed, GET=liste (critères possibles), POST=création
11 * http://www.site.tld/rest.api/atom/patates/1234 => entry, GET=lecture, PUT=mise à jour
12 */
13function action_api_http_dist(){       
14        // Il faut au moins le format dans l'argument sinon rien
15        if (!$arg = _request('arg')){
16                header('Status: 404 Not Found');
17                exit;
18        }
19        else{
20                list($format, $collection, $ressource) = explode('/', $arg);
21               
22                // Si le format n'a pas le bon format ou que le fichier avec l'implémentation n'existe pas, on arrête
23                if (!preg_match('/^[\w]+$/', $format)){
24                        header('Status: 404 Not Found');
25                        exit;
26                }
27               
28                $methode = $_SERVER["REQUEST_METHOD"];
29               
30                // Si on est dans une méthode où il FAUT poster quelque chose
31                if (in_array($methode, array('POST', 'PUT', 'PATCH'))){
32                        // On récupère le contenu
33                        $contenu = trim(file_get_contents("php://input"));
34                }
35               
36                // On cherche ce qu'on est en train de demander avec cette URL
37                // S'il n'y a pas de collection c'est l'index
38                if (!$collection) $fonction = 'index';
39                // Sinon s'il n'y a que la collection sans la ressource
40                elseif (!$ressource) $fonction = 'collection';
41                // Sinon c'est une ressource
42                else $fonction = 'ressource';
43
44                // Le GET peut se faire sur : la racine du serveur, une collection, une ressource
45                if ($methode == 'GET'
46                        and $fonction = charger_fonction("get_$fonction", "http/$format/", true) // rest_atom_get_index()
47                ){
48                        $fonction($collection, $ressource);
49                }
50                // Si la fonction n'existe pas ça n'existe pas
51                else{
52                        header('Status: 404 Not Found');
53                        exit;
54                }
55        }
56}
57
58?>
Note: See TracBrowser for help on using the repository browser.