php - seguridad - ¿Cómo construir una API RESTful?
ventajas api rest (7)
El problema es este: tengo una aplicación web que se ejecuta en un servidor PHP. Me gustaría construir una API REST para ello.
Investigué un poco y me di cuenta de que la API REST usa métodos HTTP (GET, POST ...) para ciertos URI con una clave de autenticación (no necesariamente) y la información se presenta como una respuesta HTTP con la información como XML o JSON (Prefiero JSON).
Mi pregunta es:
- ¿Cómo puedo, como desarrollador de la aplicación, construir esos URI? ¿Debo escribir un código PHP en ese URI?
- ¿Cómo construyo los objetos JSON para devolver como respuesta?
(1) ¿Cómo ... construyo esos URI? ¿Debo escribir un código PHP en ese URI?
No hay un estándar sobre cómo se debe configurar un esquema de URI de API, pero es común tener valores separados por barras. Para esto puedes usar ...
$apiArgArray = explode("/", substr(@$_SERVER[''PATH_INFO''], 1));
... para obtener una matriz de valores separados por barras en el URI después del nombre del archivo.
Ejemplo: Suponiendo que tiene un archivo API api.php
en su aplicación en alguna parte y hace una solicitud para api.php/members/3
, entonces $apiArgArray
será una matriz que contiene [''members'', ''3'']
. A continuación, puede usar esos valores para consultar su base de datos o hacer otro procesamiento.
(2) ¿Cómo construyo los objetos JSON para devolver como respuesta?
Puede tomar cualquier objeto PHP y convertirlo en JSON con json_encode . También querrás configurar el encabezado apropiado.
header(''Content-Type: application/json'');
$myObject = (object) array( ''property'' => ''value'' ); // example
echo json_encode($myObject); // outputs JSON text
Todo esto es bueno para una API que devuelve JSON, pero la siguiente pregunta que debe hacer es:
(3) ¿Cómo hago que mi API RESTful?
Para eso, usaremos $_SERVER[''REQUEST_METHOD'']
para obtener el método que se está usando, y luego haremos diferentes cosas según eso. Entonces, el resultado final es algo así como ...
header(''Content-Type: application/json'');
$apiArgArray = explode("/", substr(@$_SERVER[''PATH_INFO''], 1));
$returnObject = (object) array();
/* Based on the method, use the arguments to figure out
whether you''re working with an individual or a collection,
then do your processing, and ultimately set $returnObject */
switch ($_SERVER[''REQUEST_METHOD'']) {
case ''GET'':
// List entire collection or retrieve individual member
break;
case ''PUT'':
// Replace entire collection or member
break;
case ''POST'':
// Create new member
break;
case ''DELETE'':
// Delete collection or member
break;
}
echo json_encode($returnObject);
Fuentes: https://.com/a/897311/1766230 y en.wikipedia.org/wiki/…
Aquí hay un ejemplo muy simple en php simple.
Hay 2 archivos client.php y api.php . Puse ambos archivos en la misma url: http://localhost:8888/
, por lo que tendrá que cambiar el enlace a su propia url. (el archivo puede estar en dos servidores diferentes).
Esto es solo un ejemplo, es muy rápido y sucio, además ha pasado mucho tiempo desde que hice php. Pero esta es la idea de una API.
client.php
<?php
/*** this is the client ***/
if (isset($_GET["action"]) && isset($_GET["id"]) && $_GET["action"] == "get_user") // if the get parameter action is get_user and if the id is set, call the api to get the user information
{
$user_info = file_get_contents(''http://localhost:8888/api.php?action=get_user&id='' . $_GET["id"]);
$user_info = json_decode($user_info, true);
// THAT IS VERY QUICK AND DIRTY !!!!!
?>
<table>
<tr>
<td>Name: </td><td> <?php echo $user_info["last_name"] ?></td>
</tr>
<tr>
<td>First Name: </td><td> <?php echo $user_info["first_name"] ?></td>
</tr>
<tr>
<td>Age: </td><td> <?php echo $user_info["age"] ?></td>
</tr>
</table>
<a href="http://localhost:8888/client.php?action=get_userlist" alt="user list">Return to the user list</a>
<?php
}
else // else take the user list
{
$user_list = file_get_contents(''http://localhost:8888/api.php?action=get_user_list'');
$user_list = json_decode($user_list, true);
// THAT IS VERY QUICK AND DIRTY !!!!!
?>
<ul>
<?php foreach ($user_list as $user): ?>
<li>
<a href=<?php echo "http://localhost:8888/client.php?action=get_user&id=" . $user["id"] ?> alt=<?php echo "user_" . $user_["id"] ?>><?php echo $user["name"] ?></a>
</li>
<?php endforeach; ?>
</ul>
<?php
}
?>
api.php
<?php
// This is the API to possibility show the user list, and show a specific user by action.
function get_user_by_id($id)
{
$user_info = array();
// make a call in db.
switch ($id){
case 1:
$user_info = array("first_name" => "Marc", "last_name" => "Simon", "age" => 21); // let''s say first_name, last_name, age
break;
case 2:
$user_info = array("first_name" => "Frederic", "last_name" => "Zannetie", "age" => 24);
break;
case 3:
$user_info = array("first_name" => "Laure", "last_name" => "Carbonnel", "age" => 45);
break;
}
return $user_info;
}
function get_user_list()
{
$user_list = array(array("id" => 1, "name" => "Simon"), array("id" => 2, "name" => "Zannetie"), array("id" => 3, "name" => "Carbonnel")); // call in db, here I make a list of 3 users.
return $user_list;
}
$possible_url = array("get_user_list", "get_user");
$value = "An error has occurred";
if (isset($_GET["action"]) && in_array($_GET["action"], $possible_url))
{
switch ($_GET["action"])
{
case "get_user_list":
$value = get_user_list();
break;
case "get_user":
if (isset($_GET["id"]))
$value = get_user_by_id($_GET["id"]);
else
$value = "Missing argument";
break;
}
}
exit(json_encode($value));
?>
No llamé a la base de datos para este ejemplo, pero normalmente eso es lo que debes hacer. También debe reemplazar la función "file_get_contents" por "curl".
Como dijo simon marc, el proceso es muy similar al que está usted o yo navegando en un sitio web. Si te sientes cómodo con el uso del framework Zend, hay algunos tutoriales fáciles de seguir que hacen que la vida sea bastante fácil de configurar. La parte más difícil de construir una API apta es el diseño de la misma y, para que sea realmente relajante, piense en CRUD en términos de bases de datos.
Podría ser que realmente quieres una interfaz xmlrpc u otra cosa similar. ¿Qué quieres que te permita esta interfaz?
--EDITAR
Aquí es donde comencé con la API apta y Zend Framework. Ejemplo de Zend Framework
En resumen, no use el servidor de reposo Zend, es obsoleto.
En 2013, deberías usar algo como Silex o Slim
Ejemplo de Silex:
require_once __DIR__.''/../vendor/autoload.php'';
$app = new Silex/Application();
$app->get(''/hello/{name}'', function($name) use($app) {
return ''Hello ''.$app->escape($name);
});
$app->run();
Ejemplo delgado:
$app = new /Slim/Slim();
$app->get(''/hello/:name'', function ($name) {
echo "Hello, $name";
});
$app->run();
Eso es más o menos lo mismo que creó un sitio web normal.
El patrón normal para un sitio web php es:
- El usuario ingresa una url
- El servidor obtiene la url, lo analiza y ejecuta una acción
- En esta acción, obtienes / generas toda la información que necesitas para la página
- Usted crea la página html / php con la información de la acción
- El servidor genera una página completamente html y la envía al usuario
Con una API, simplemente agrega un nuevo paso entre 3 y 4. Después de 3, cree una matriz con toda la información que necesita. Codifique esta matriz en json y salga o regrese este valor.
$info = array("info_1" => 1; "info_2" => "info_2" ... "info_n" => array(1,2,3));
exit(json_encode($info));
Eso todo por la api. Para el lado del cliente, puede llamar a la API mediante la url. Si la API funciona solo con get call, creo que es posible hacer un simple (para verificar, normalmente uso Curl).
$info = file_get_contents(url);
$info = json_decode($info);
Pero es más común usar la biblioteca curl para realizar get y post call. Puedes preguntarme si necesitas ayuda con Curl.
Una vez que obtenga la información de la API, puede hacer los pasos 4 y 5.
Mire php doc para la función json y file_get_contents.
curl: http://fr.php.net/manual/fr/ref.curl.php
EDITAR
No, espera, no lo entiendo "página API de php" ¿qué quieres decir con eso?
La API es solo la creación / recuperación de su proyecto. NUNCA envíes directamente el resultado de html (si estás creando un sitio web) lanza una API. Llama a la API con la url, la información de retorno de la API, usa esta información para crear el resultado final.
ex: quieres escribir una página html que diga hola xxx. Pero para obtener el nombre del usuario, debe obtener la información de la API.
Entonces, digamos que su api tiene una función que tiene user_id como argumento y devuelve el nombre de este usuario (digamos getUserNameById (user_id)), y llama a esta función solo en una url como su / api / ulr / getUser / id.
Function getUserNameById(user_id)
{
$userName = // call in db to get the user
exit(json_encode($userName)); // maybe return work as well.
}
Desde el lado del cliente lo haces
$username = file_get_contents(your/api/url/getUser/15); // You should normally use curl, but it simpler for the example
// So this function to this specifique url will call the api, and trigger the getUserNameById(user_id), whom give you the user name.
<html>
<body>
<p>hello <?php echo $username ?> </p>
</body>
</html>
Entonces, el cliente nunca accede directamente a las bases de datos, que la función de la API.
¿Está eso más claro?
Otro marco que no se ha mencionado hasta ahora es Laravel . Es genial para crear aplicaciones PHP en general, pero gracias al gran enrutador es realmente cómodo y simple crear API completas. Puede que no sea tan delgada como Slim o Sliex, pero te da una estructura sólida.
Ver Aaron Kuzemchak - Desarrollo simple de API con Laravel en YouTube y
Laravel 4: A Comience con una API RESTful en NetTuts +
Sé que esta pregunta es aceptada y tiene un poco de edad, pero esto podría ser útil para algunas personas que todavía la consideran relevante. Aunque el resultado no es una API RESTful completa, la API mini de API Builder le permite transformar fácilmente bases de datos MySQL en API JSON accesibles a través de la web.