如何构build一个RESTful API?

问题是这样的:我有一个运行在PHP服务器上的Web应用程序。 我想为它构build一个REST API。
我做了一些研究,我发现REST api使用HTTP方法(GET,POST …)为某些URI提供了一个authentication密钥(不一定),信息以HTTP或XML响应的forms呈现(我宁愿JSON)。

我的问题是:

  1. 作为应用程序的开发者,我如何构build这些URI? 我是否需要在该URI编写一个PHP代码?
  2. 我如何构buildJSON对象作为响应返回?

这里是一个简单的PHP例子。

有2个文件client.phpapi.php 。 我把这两个文件在同一个url: http://localhost:8888/ ,所以你将不得不改变链接到自己的url。 (该文件可以在两个不同的服务器上)。

这只是一个例子,它非常快速和肮脏,加上它已经很长时间,因为我已经做了PHP。 但这是一个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)); ?> 

我没有为这个例子调用数据库,但是通常这是你应该做的。 你也应该用“curl”replace“file_get_contents”函数。

在2013年,你应该使用像Silex或苗条的东西

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(); 

苗条的例子:

 $app = new \Slim\Slim(); $app->get('/hello/:name', function ($name) { echo "Hello, $name"; }); $app->run(); 

这几乎与创build一个正常的网站相同。

一个PHP网站的正常模式是:

  1. 用户input一个url
  2. 服务器获取url,parsing并执行一个操作
  3. 在此操作中,您可以获取/生成该页面所需的所有信息
  4. 您可以使用操作中的信息创buildhtml / php页面
  5. 服务器生成一个完整的html页面并将其发回给用户

用api,你只需要在3和4之间添加一个新的步骤.3之后,创build一个包含所有你需要的信息的数组。 在json中编码这个数组并退出或返回这个值。

 $info = array("info_1" => 1; "info_2" => "info_2" ... "info_n" => array(1,2,3)); exit(json_encode($info)); 

这一切都是为了api。 对于客户端,你可以通过url调用api。 如果api只能在打电话的情况下工作,我认为可以做一个简单的(检查,我通常使用curl)。

 $info = file_get_contents(url); $info = json_decode($info); 

但是使用curl库执行get和post调用更为常见。 你可以问我是否需要卷发帮助。

一旦从api获取信息,就可以执行4和5个步骤。

看看PHP文档的JSON函数和file_get_contents。

curl: http : //fr.php.net/manual/fr/ref.curl.php


编辑

不,等等,我不明白。 “php API页面”你是什么意思?

api只是您的项目的创build/恢复。 你永远不会直接发送HTML结果(如果你正在做一个网站)扔api。 你用url调用api,api返回信息,你使用这个信息来创build最终结果。

例如:你想写一个html页面的人说你好xxx。 但要获得用户的名字,你必须从api获取信息。

所以我们假设你的api有一个以user_id作为参数的函数,并返回这个用户的名字(比如说getUserNameById(user_id)),而且你只能在像/ api / ulr / getUser / id这样的url上调用这个函数。

 Function getUserNameById(user_id) { $userName = // call in db to get the user exit(json_encode($userName)); // maybe return work as well. } 

客户端你做

  $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> 

所以客户端永远不能直接访问数据库,即api的angular色。

这更清楚吗?

(1)我如何…build立这些URI? 我是否需要在该URI编写一个PHP代码?

如何设置API URIscheme没有标准,但通常使用斜杠分隔的值。 为此,您可以使用…

 $apiArgArray = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); 

…在文件名后面的URI中获得一个斜杠分隔值数组。

例子:假设你的应用程序中有一个API文件api.php ,并且你要求api.php/members/3 ,那么$apiArgArray将是一个包含['members', '3']的数组。 然后,您可以使用这些值来查询您的数据库或进行其他处理。

(2)如何构buildJSON对象作为响应返回?

你可以把任何PHP对象,并把它变成json与json_encode 。 您还需要设置适当的标题。

 header('Content-Type: application/json'); $myObject = (object) array( 'property' => 'value' ); // example echo json_encode($myObject); // outputs JSON text 

所有这些对于返回JSON的API都是很好的,但是下一个问题应该是:

(3)如何使我的API RESTful?

为此,我们将使用$_SERVER['REQUEST_METHOD']来获取正在使用的方法,然后根据该方法做不同的事情。 所以最后的结果就像…

 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); 

来源: https : //stackoverflow.com/a/897311/1766230和http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services

目前还没有提到的另一个框架是Laravel 。 一般来说,构buildPHP应用程序是非常好的,但是要感谢伟大的路由器,构build丰富的API真的很舒服,也很简单。 它可能不像Slim或Sliex那样苗条,但它给你一个坚实的结构。

请参阅Aaron Kuzemchak -在YouTube和YouTube上使用Laravel进行简单的API开发

Laravel 4:从 NetTuts + 上的RESTful API开始

我知道这个问题已经被接受,有一定的年龄,但这对于一些仍然认为有用的人来说可能是有帮助的。 虽然结果不是完整的RESTful API,但PHP的API Builder微型库允许您轻松地将MySQL数据库转换为可访问的Web JSON API。

正如西蒙·马克说,这个过程和你或我浏览网站的过程是一样的。 如果您对使用Zend框架感到满意,可以使用一些简单的教程来使devise变得非常容易。 build立一个安静的api最难的部分是它的devise,并使其真正安宁,从数据库angular度来看CRUD。

这可能是你真的想要一个xmlrpc接口或其他类似的东西。 你想让这个界面让你做什么?

– 编辑

这里是我开始使用restful api和Zend Framework的地方。 Zend框架示例

总之不要使用Zendrest服务器,它已经过时了。