web-dev-qa-db-fra.com

Utilisation d'URL propres dans l'API RESTful

Les "URL propres" également appelées "URL RESTful" sont conviviales, purement structurelles et ne contiennent pas de chaîne de requête. Au lieu de cela, ils ne contiennent que le chemin de la ressource.

par exemple: "http://Twitter.com/users/show/"+username+".json"

Questions sur les fonctionnalités côté serveur:

  1. Dois-je créer un script API côté serveur unique pour chaque répertoire?

  2. Puis-je transmettre toutes les demandes à un seul script si oui, comment puis-je extraire des informations utiles de la structure URL propre ($ _GET ['url_structure'])?

  3. Pourquoi Twitter appelle-t-il un fichier .json qui n'existe sûrement pas? Il doit être généré sur demande. Comment cela marche-t-il? Cela m'amène à croire que la réponse à la question 2 est oui.

35
Tyler Buchea

1) Pas si vous utilisez un framework RESTful comme RecessPHP ou si vous utilisez une règle mod_rewrite dans votre fichier .htaccess pour rediriger toutes les demandes d'API à un seul PHP (connu sous le nom de contrôleur frontal).

. htaccess

RewriteEngine On
RewriteRule ^/api/ api.php

api.php

$request = $_SERVER['REQUEST_URI'];  //this would be /users/show/abc.json

2) Vous pouvez utiliser le module de réécriture d'Apache pour rediriger toutes les demandes api vers un fichier PHP PHP qui les gère) . En fonction de votre configuration Apache, l'URL d'origine demandée (RESTful) sera stockée dans une variable serveur en PHP, je crois que c'est $_SERVER['REQUEST_URI']. Bien sûr, vous pouvez également passer un $_GET[] variable à PHP qui contenait l'URL RESTful.

. htaccess

RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2

api.php

$request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc')
$file_type     = $_GET['type'];

$output = get_data_from_db(); //Do your processing here
                              //You can outsource to other files via an include/require

//Output based on request
switch($file_type) {
    case 'json':
        echo json_encode($output);
        break;
    case 'xml':
        echo xml_encode($output); //This isn't a real function, but you can make one
        break;
    default:
        echo $output;
}

3) Twitter (et de nombreuses autres API) l'utilisent car c'est un moyen pratique de fournir le format qu'une application attend d'une API. Toutes les demandes d'API sont redirigées vers un seul fichier PHP qui gère la création de tous les fichiers et l'écho de leur contenu dans la sortie. Le fichier n'est jamais réellement stocké sur le serveur (sauf s'il est mis en cache) .


Bonnes ressources


Une note sur RecessPHP. C'est certainement un excellent outil et je vous encourage à le regarder (peut-être à sa source pour avoir une idée de la façon dont il traite les choses), mais cela dit, il me semble un peu maladroit. Le fait que les noms de chemin soient écrits dans des commentaires spéciaux ne me semble pas très PHP. Je m'éloignerais de cela et je ne dirais pas que c'est le cadre parfait, mais c'est certainement un début. Bonne chance!

59
Bailey Parker

Cela a fonctionné pour moi: mettez-le dans le fichier htaccess à la racine de votre site Web.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]
RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L]
</IfModule>

Et puis si vous allez à la page http: // localhost/api/person/susan Vous verrez que cela vous amène au fichier à http: // localhost/api/api .php J'ai aussi une page de recette que je vais utiliser http: // localhost/recette/edit/2 Mettez ceci dans le fichier api.php:

<?php
$requestParts = explode('/',$_GET['request']);
$category = $requestParts[0];
$action = $requestParts[1];
$data = $requestParts[2];
if($category == 'recipe'){
    include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php');
}

Les variables ci-dessus contiendront la catégorie: recette, action: ajouter ou modifier, et les données qui peuvent être un nombre qui est l'identifiant de la recette ou ce que vous voulez qu'elle soit. Ensuite, à l'intérieur du fichier add_recipe.php, utilisez les variables pour déterminer si vous modifiez ou ajoutez une recette. Et si vous utilisez l'API, vous pouvez inclure différents fichiers en fonction de la demande Ajax que vous utilisez pour parler à votre API.

7
PHPGuru

Essaye ça:

RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]
0
Sony Choudhary