【翻译】使用 PHP 构建简单的 REST API
我这学期有一门偏向前端的 WEB 课程,期末大作业要求使用 PHP 作为后端语言实现一个简单的影评系统,应该是不允许使用框架,使用中文关键字在搜索引擎上搜了一阵子似乎没有可供参考的案例,后来就找到了这篇博客,当中的许多观点与我不谋而合,因此我将这篇博客翻译成中文,原文戳这里: https://amirkamizi.com/blog/php-simple-rest-api
介绍
上周 @rapid_api 发了一个非常好的关于使用 nodejs 和 express 创建 REST API 的教程帖子。我想要帮助你使用 PHP 开发同样简单的 REST API。
首先,如果你不了解 REST API,请务必查看这个 Twitter 帖子。
目标
在我们开始之前,我想提一句,当我写这篇帖子的时候,我想确保:
- 我使用单纯的 PHP,不使用框架
- 我使用最简单的函数和结构体以便所有人都可以理解并跟上
- 我将主体部分分开
现在让我们开始吧
准备
在我本地的机器上,我创建了一个叫 api 的文件夹于 xampp > htdocs,在里面有一个叫 index.php 的文件
如果你没有 xampp 或者你不知道如何把 php 跑起来,请务必查看这篇文章
现在,如果你尝试访问 localhost/api,你将得到一个空的响应,因为 index.php 文件是空的
优雅的 URL
项目中,我们需要处理的第一件事是 url
REST API 的关键特性之一是每一个 url 负责一个资源和一个操作
问题
这时候如果我创建一个 users.php,我需要访问
localhost/api/users.php我需要为每一个 user id 创建一个新的文件
localhost/api/users/1.phplocalhost/api/users/2.php以此类推。
这种方案有两个问题
- 为每个用户创建一个新文件是非常无聊和耗时的
- 路由不优雅,每个路径后面都带有 .php
解决方案
让我们解决这个问题。
正如我所提到的,我不想使用任何框架,并且我想使用最简单的、最让人能够理解的方案
让我们看看如何解决这个问题
在 api 文件夹下创建一个叫 .htaccess 的文件,并且将下面的文本复制进去
RewriteEngine OnRewriteBase /apiRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.+)$ index.php [QSA,L]我们告诉服务器,将所有指向 /api 的请求都转发到 index.php 文件
现在,所有的 url 都指向 index.php 了,比如下面的 url 都是指向 index.php 的
api/usersapi/users/10api/users/5现在我们同时解决了这两个问题
- 所有的 url 都被一个文件处理
- url 都很优雅,结尾处没有 .php
URI
但如何知道用户请求的是哪个 uri 呢?
很简单,使用 $_SERVER 超全局变量
让我们来看一些例子
// url api/usersecho $_SERVER['REQUEST_URI'];// /api/users// url api/users/5echo $_SERVER['REQUEST_URI'];// /api/users/5// url apiecho $_SERVER['REQUEST_URI'];// /api看见了吗?这就是我们所需要的
现在,使用一个简单的 if 或者 switch 语句,我们就可以处理不同的路径了
如果你从来没有用过这些语句,去读这篇文章。
请求方法
接下来,我们需要从请求中获取请求的方法,以查看它是GET、POST、PUT、PATCH还是DELETE。
你可以从 $_SERVER 超全局数组中获取这个信息。
$_SERVER['REQUEST_METHOD']让我们将这两个值存储在变量中:
$uri = $_SERVER['REQUEST_URI'];$method = $_SERVER['REQUEST_METHOD'];我们可以在一个简单的 switch 语句中使用这两个变量来处理不同的请求。
我们需要判断以下请求...
剩余内容已隐藏