php实现restful风格的json接口,编写 JSON API —— RESTful 风格 API 设计原则与最佳实践...

编写 JSON API —— RESTful 风格 API 设计原则与最佳实践

由 学院君 创建于1年前, 最后更新于 1年前

版本号 #1

9524 views

9 likes

2 collects

概述

在移动互联网时代,Laravel 开发者日常接触最多的任务应该就是编写 JSON API 接口,基于 RESTful 风格或类 RESTful 风格,以便允许第三方应用/客户端应用与后台应用通过这些 API 接口进行交互。

在 Laravel 项目中实现 JSON API 非常简单,框架底层为此做了大量的工作,提供了大量相关的方法、与之相关的资源控制器、以及 API 资源类、API 认证实现等。在「编写 JSON API」这一系列教程中,学院君将围绕如何构建 JSON API 展开,我们将一起学习编写 API 的一些基本原则、Laravel 框架官方提供的用于编写 API 的工具、以及一些知名的相关第三方扩展包。

我们首先从编写 JSON API 的基本原则说起。

RESTful 风格 API

REST 是目前最流行的 API 接口设计规范,其全名是 Representational State Transfer,中文译作表现层状态转化,这一规范最早由 HTTP 协议的主要设计者 Roy Thomas Fielding 于 2000 年在他的博士论文中提出,主要目的是便于在不同程序在网络中传递信息。如果一个 API 接口设计符合 REST 规范,我们就将这样的 API 称之为 RESTful 风格 API。

要理解 REST 规范,我们需要把把规范名称拆开来看:

表现层

所谓表现层,指的是 Web 资源的表现层。

在互联网中,每一个 URL 都唯一标识一个独立的 Web 资源,这些资源可能是文本、图片、视频等,而资源的表现层,指的是资源具体呈现的外在表现形式,比如文本可能以 HTML、XML、JSON 等格式呈现,URL 的局限性是只能标识资源的位置,不能标识资源的表现形式,资源的表现形式通常在 HTTP 报文首部通过指定字段来表示,比如我们在请求头中通过 Accept 字段来标识客户端支持的内容类型(表现形式),在响应头中通过 Content-Type 字段来标识返回响应实体的内容类型(表现形式)。

状态转化

当客户端请求服务器上某个 Web 资源(即请求某个 URL)时,有可能会涉及到资源的状态转化,这些状态转化是基于资源的表现层之上的。而要让服务器资源发生状态转化,势必要让客户端使用某种手段对服务器资源进行操作,而在 HTTP 通信中,这些手段就是 HTTP 的请求方法:通过 GET 方法获取资源,通过 POST 方法创建资源,通过 PUT/PATCH 方法更新资源,通过 DELETE 方法删除资源。这些状态转化是基于资源的表现层之上的,通常我们使用的是 JSON 格式数据。

综合上述,RESTful 风格的 API 设计是围绕 Web 资源展开的,在基于 HTTP 协议的 Web 服务中,我们通过 URL 来表示资源的位置,通过在 HTTP 报文首部中设置相应的首部字段来表示资源的类型,资源的位置+类型+实体数据合起来称作资源的表现层,客户端与服务端的交互过程中,对资源的请求和访问可能导致其表现层状态的转化,比如获取、新增、更新、删除等,而这些状态变化则是通过 HTTP 请求方法来实现。

最佳实践

了解了 RESTful 的概念和原则之后,我们来看一下 RESTful 风格 API 的最佳实践:

围绕「资源」展开,且这些资源通过 URL 进行标识,比如 /posts 用于表示所有文章,/posts/15 用于表示 ID 为 15 的文章,至于资源名称用单数还是复数,没有统一规定,但通常我们使用复数,另外 URL 要尽可能简单,不要拖泥带水;

与资源的交互通过 HTTP 请求方法来实现,而不是将操作动作包含到 URL 中,比如 GET /posts/15 用于获取 ID 为 15 的文章,DELETE /posts/15 用于删除 ID 为 15 的文章;

接口的设计需要遵循无状态原则,不同的接口请求之间不要有持久化的 Session 认证,每个接口请求都需要自己独自去认证;

返回的响应状态码尽可能精准描述服务器处理结果,比如成功用 2XX 状态码,重定向用 3XX 状态码,资源不存在用 404,没有权限用 403,需要认证用 401,服务器错误用 5XX 状态码,并且对异常情况尽可能在响应实体中予以说明;

约定在客户端与服务器交互过程中以 JSON 格式传递数据,即资源的外在表现形式是 JSON。

以前面编写的待办任务项目为例,我们在 Laravel 中通过 Artisan 命令创建资源控制器后,在 routes/api.php 中通过 Route::resource('tasks', 'TaskController'); 注册路由,系统会自动为我们构建遵循 RESTful 风格的 API 接口骨架:

80922507173ebe058d7935ad6dec2b13.png

下一篇教程我们将编写对应的控制器方法来实现基于 RESTful 风格的 JSON API 接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 PHP 实现 RESTful API,可以按照以下步骤操作: 1. 设计 API 的 URL 结构和 HTTP 动词 RESTful API 的核心是使用 HTTP 动词来表示资源的操作,例如 GET、POST、PUT、DELETE 等。另外,API 的 URL 结构也需要设计得合理,以便用户可以轻松地找到资源。 2. 创建 API 的路由 在 PHP 中,可以使用框架(例如 Laravel、Symfony 等)来创建 RESTful API 的路由。在路由文件中,需要为每个资源定义相应的 URL 和 HTTP 动词。 3. 实现 API 的控制器 控制器负责处理 API 的请求,并返回相应的响应。在控制器中,需要编写相应的代码来处理 GET、POST、PUT、DELETE 等操作。 4. 处理请求参数和数据 API 请求通常包含参数和数据。在 PHP 中,可以使用 $_GET、$_POST、$_PUT、$_DELETE 等预定义变量来获取请求参数和数据。在控制器中,需要对这些变量进行适当的处理。 5. 返回 JSON 数据 RESTful API 通常返回 JSON 数据。在 PHP 中,可以使用 json_encode() 函数将数据转换为 JSON 格式,并使用 header() 函数设置 Content-Type 头部为 application/json。 6. 处理错误 在编写 RESTful API 的过程中,需要考虑各种错误情况,例如资源不存在、无效的请求等。在控制器中,需要编写相应的代码来处理这些错误情况,并返回相应的错误信息。 示例代码: 以下是一个简单的 PHP RESTful API 示例代码: ```php <?php require_once 'vendor/autoload.php'; use Slim\Slim; $app = new Slim(); // GET /books $app->get('/books', function () use ($app) { $books = array( array('id' => 1, 'title' => 'The Catcher in the Rye', 'author' => 'J. D. Salinger'), array('id' => 2, 'title' => 'To Kill a Mockingbird', 'author' => 'Harper Lee'), array('id' => 3, 'title' => '1984', 'author' => 'George Orwell') ); $app->response()->header('Content-Type', 'application/json'); echo json_encode($books); }); // POST /books $app->post('/books', function () use ($app) { $book = json_decode($app->request()->getBody()); // Save the book to the database $app->response()->header('Content-Type', 'application/json'); echo json_encode(array('status' => 'success')); }); // PUT /books/:id $app->put('/books/:id', function ($id) use ($app) { $book = json_decode($app->request()->getBody()); // Update the book in the database $app->response()->header('Content-Type', 'application/json'); echo json_encode(array('status' => 'success')); }); // DELETE /books/:id $app->delete('/books/:id', function ($id) use ($app) { // Delete the book from the database $app->response()->

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值