一些与RESTful和PHP相关的基本问题


Some really basic questions to do with RESTful and PHP

我正在尝试RESTful API。我设计了一些简单的类来表示系统的每个元素,包括消息和房间类(它是一个聊天应用程序,其中包含任意数量的消息)。

我经常看到 URI 的形式,例如

/room                                (this would get all rooms)
/room/{room_id}                      (this would create, update or delete a room with this ID)
/room/{room_id}/message              (this would get all messages from a room with the specified ID)
/room/{room_id}/meesage/{message_id} (this would create, update or delete a message with this id)

所以我想我的两个问题是:

1) 如何将这些请求的 URI 重定向到我的单个处理脚本(位于/api/api.1.0.0.php)

2)如何使用正确的HTTP动词(如放置,删除,更新等)请求这些URI。

编辑:我应该补充一点,我希望在没有框架的情况下做到这一点。

下面介绍如何在 apache 上使用 mod_rewrite 将所有请求重定向到单个脚本。您将需要使用 apache 并安装/设置mod_rewrite(它安装在大多数共享主机上,并且易于添加到自我管理系统中)。

在文档根目录下 API 所在的子文件夹中创建一个.htaccess文件。将以下内容添加到文件中:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?URI=$1 [L,QSA]

第一个条件将确保文件不存在,因此您仍然可以加载确实存在的文件(没有它,即使是有效文件的请求也会重写)。第二个条件执行相同的操作,但检查它是否不是正在请求的有效目录。最后一行,即规则,捕获 URI 并告诉 apache 加载index.php而不是将 URI 传递给 URI get 参数。规则的末尾是标志、LQSAL 标志告诉 apache 停止处理规则,如果满足这个规则,QSA告诉 apache 自动附加传递的任何查询字符串(获取字符串)参数。

然后,您可以使用 $_GET['URI'] 访问 php 中的 URI。一个简单的$URI = explode('/', $_GET['URI']);将为您提供一个格式良好的数组,其中包含传递的每个参数。

至于在请求特定 url 后指示正确应用程序的一部分,您应该阅读有关路由器的信息。所有主要的MVC框架都将具有先进的路由解决方案。http://framework.zend.com/manual/current/en/modules/zend.mvc.routing.html

如果你想没有框架并使用单个脚本,Apache mod_rewrite是你的朋友。

要使用不同的http方法创建请求,请使用任何REST客户端,例如Chrome的Postman。

编辑:

.htaccess 示例:

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^ index.php [NC,L]