竹林里有冰的博客

竹林里有冰的博客

马上订阅 竹林里有冰的博客 RSS 更新: https://zhul.in/rss.xml

【翻译】使用 PHP 构建简单的 REST API

2023年12月12日 13:07

我这学期有一门偏向前端的 WEB 课程,期末大作业要求使用 PHP 作为后端语言实现一个简单的影评系统,应该是不允许使用框架,使用中文关键字在搜索引擎上搜了一阵子似乎没有可供参考的案例,后来就找到了这篇博客,当中的许多观点与我不谋而合,因此我将这篇博客翻译成中文,原文戳这里: https://amirkamizi.com/blog/php-simple-rest-api

介绍

上周 @rapid_api 发了一个非常好的关于使用 nodejs 和 express 创建 REST API 的教程帖子。我想要帮助你使用 PHP 开发同样简单的 REST API。

首先,如果你不了解 REST API,请务必查看这个 Twitter 帖子

目标

在我们开始之前,我想提一句,当我写这篇帖子的时候,我想确保:

  1. 我使用单纯的 PHP,不使用框架
  2. 我使用最简单的函数和结构体以便所有人都可以理解并跟上
  3. 我将主体部分分开

现在让我们开始吧

准备

在我本地的机器上,我创建了一个叫 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

以此类推。

这种方案有两个问题

  1. 为每个用户创建一个新文件是非常无聊和耗时的
  2. 路由不优雅,每个路径后面都带有 .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

现在我们同时解决了这两个问题

  1. 所有的 url 都被一个文件处理
  2. 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 语句中使用这两个变量来处理不同的请求。

我们需要判断以下请求...

剩余内容已隐藏

查看完整文章以阅读更多