2011-11-28 22 views
31

Las "URL limpias" también conocidas como "URL RESTful" son fáciles de usar, son puramente estructurales y no contienen una cadena de consulta. En cambio, contienen solo la ruta del recurso.Uso de URL limpias en API RESTful

es decir: "http://twitter.com/users/show/"+username+".json"

Preguntas sobre la funcionalidad del lado del servidor:

  1. ¿Es necesario crear una secuencia de comandos API de servidor única para cada directorio?

  2. ¿Puedo reenviar todas las solicitudes a una sola secuencia de comandos? En caso afirmativo, ¿cómo extraigo información útil de la estructura de URL limpia ($ _GET ['url_structure'])? I ?

  3. ¿Por qué Twitter llama a un archivo .json que seguramente no existe? Debe ser generado bajo petición. ¿Cómo funciona ? Esto me lleva a creer que la respuesta a la pregunta 2 es sí.

+1

Las URL limpias no tienen nada que ver con las API REST. Son solo una buena manera de embellecer urls que de otra manera tendrían cadenas de consulta feas. Generalmente se implementan usando mod_rewrite para tomar la URL limpia y transformarla internamente de nuevo a una versión de cadena de consulta. –

Respuesta

53

1) No, si se utiliza un marco REST como RecessPHP o si utiliza una regla mod_rewrite en su archivo .htaccess para redirigir todas las solicitudes de la API en un solo archivo PHP (conocido como el controlador frontal).

.htaccess

RewriteEngine On 
RewriteRule ^/api/ api.php 

api.php

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

2) Se puede utilizar el módulo de reescritura de Apache para redirigir todas las solicitudes de API a una especial Archivo PHP que los maneja. Dependiendo de su configuración de Apache, la url original solicitada (RESTful) se almacenará en una variable de servidor en PHP, creo que es $_SERVER['REQUEST_URI']. Por supuesto, también podría pasar una variable $_GET[] a PHP que contenía la 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 (y muchas otras API) utilizar esto porque es una forma conveniente de suministrando el formato que una aplicación espera de una API. Todas las solicitudes API se redirigen a un solo archivo PHP que maneja la creación de todos los archivos y hace eco de sus contenidos en la salida. El archivo nunca se almacena en el servidor (a menos que esté en caché).


Buenas Recursos


Una nota o n RecessPHP. Sin duda es una gran herramienta y te animo a que lo mires (tal vez en su origen para tener una idea de cómo procesa las cosas), pero dicho esto, me parece un poco torpe. El hecho de que los nombres de ruta estén escritos en comentarios especiales parece muy poco PHP para mí. Me alejaría de esto, y no lo llamaría el marco perfecto, pero sin duda es un comienzo. ¡Buena suerte!

+2

Gracias por la increíble respuesta que realmente cubriste. Normalmente me alejo de los marcos a menos que me ahorre mucho tiempo. Pero definitivamente revisaré Recess. –

+0

Yo también estaba buscando sugerencias sobre la implementación del servidor de URL RESTful. Sospeché que Front Controller estaba involucrado, así que gracias por la claridad. Esta es una respuesta genial. – ComethTheNerd

+0

@Bailey Parker :: El enlace al marco de PHP Recess que proporcionó, ya no funciona: "AVISO: Este nombre de dominio expiró el 29/10/2017 y está pendiente de renovación o eliminación". – Peter

-4

Usaría un framework como CodeIgniter. No necesita un directorio para cada parte de la URL, solo utiliza un archivo .htaccess para redirigir todas las URL a una url específica y hacer que esa url se ocupe de todas las acciones.

+0

Eso es más o menos lo que estoy haciendo aquí. Uso un archivo .htaccess para apuntar al archivo api.php mencionado. Entonces eso usa la lógica para decidir dónde enviar al usuario. – PHPGuru

5

Esto funcionó para mí: Ponlo en el archivo htaccess en la raíz de tu sitio 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> 

Y luego si vas a la página http://localhost/api/person/susan Usted verá que le lleva al archivo en http://localhost/api/api.php también tengo una página de la receta que voy a usar http://localhost/recipe/edit/2 poner esto en el api.php archivo:

<?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'); 
} 

las variables anteriores mantendrán la categoría: receta, acción: añadir o editar y los datos que pueden ser un número que es el ID de la receta o lo que quiera que sea. Luego dentro de add_recipe.php usa las variables para determinar si estás editando o agregando una receta. Y si usa la API, puede incluir diferentes archivos según la solicitud de Ajax que esté utilizando para hablar con su API.