您的当前位置:首页>全部文章>文章详情

【PHP】RESTfulAPI详解

CrazyPanda发表于:2024-05-24 23:09:36浏览:275次TAG:

1. 什么是RESTfulAPI

RESTful API 是一种互联网软件架构的设计规范,设计指南,设计风格,设计原则(类似于web标准,并不是标准【规范,原则】)

2. 产生背景

开始开发时,前后端高度融合(耦合)
近些年:前后端分离,前端各种客户端产生。基于这种现状,需要一个统一的机制。为前后端通信服务(API机制) 因此,前后端分离开来前后端基于API 开发,即:面向接口开发 前后端基于接口传递数据。
RESTfulAPI作为制定接口标准的规范而产生了。

3. RESTful API

  1. API简介:
    a. 应用程序编程接口(接口)application programming interface

  2. API发展历史:
    a. 威尔克斯和惠勒 1951 年出版的《电子数字计算机程序的准备》一书包含了第一个发布的 API 规范。Joshua Bloch认为 Wilkes 和 Wheeler “潜在地发明”了 API,因为它更像是一个被发现而不是发明的概念。
    b. 术语“应用程序接口”(没有-ing后缀)首先记录在 1968 年AFIPS会议上发表的一篇名为远程计算机图形的数据结构和技术的论文中。
    c. CJ Date[8]在 1974 年的一篇名为The Relational and Network Approaches: Comparison of the Application Programming Interface 的论文中将该术语引入数据库领域。

  3. 没有RESTful之前,开发人员必须同时具有前后端开发的能力
    前端的工作十分尴尬,因此那个阶段,前端的地位并不是很高。当时的代码也十分混乱,不能访问其他域的数据。后来google带动ajax,兴起前后端分离的思想,API正式兴起,前后端开始各司其职。

  4. REST:(一种软件架构风格)
    a. REST 是 REpresentational State Transfer 的首字母缩写,是分布式超媒体系统的一种架构风格 。罗伊菲尔丁于 2000 年在他著名的 论文中首次提出它。

4. RESTful六个指导原则

RESTful 架构的六个指导原则或 约束 是:

4.1. 统一接口

通过将 通用性原则应用于 组件接口,我们可以简化整个系统架构并提高交互的可见性。
多个架构约束有助于获得统一的接口并指导组件的行为。
以下四个约束可以实现统一的 REST 接口:
● 资源标识 ——接口必须唯一标识客户端和服务器之间交互中涉及的每个资源。
● 通过表示操作资源 ——资源在服务器响应中应该有统一的表示。API 使用者应该使用这些表示来修改服务器中的资源状态。
● 自描述消息 ——每个资源表示应该携带足够的信息来描述如何处理消息。它还应该提供客户端可以对资源执行的附加操作的信息。
● 超媒体作为应用程序状态的引擎 ——客户端应该只有应用程序的初始 URI。客户端应用程序应该使用超链接动态驱动所有其他资源和交互。

4.2. 客户端服务器

客户端-服务器设计模式强制 关注点分离,这有助于客户端和服务器组件独立发展。
通过将用户界面关注点(客户端)与数据存储关注点(服务器)分离,我们提高了用户界面跨多个平台的可移植性,并通过简化服务器组件来提高可扩展性。
在客户端和服务器发展的同时,我们必须确保客户端和服务器之间的接口/契约不会中断。

4.3. 无状态

无状态 要求从客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息。
服务器无法利用服务器上任何先前存储的上下文信息。
因此,客户端应用程序必须完全保持会话状态。

4.4. 可缓存

可 缓存约束 要求响应应隐式或显式地将自身标记为可缓存或不可缓存。
如果响应是可缓存的,则客户端应用程序有权在稍后为等效请求和指定时间段重用响应数据。

4.5. 分层系统

分层系统样式允许通过约束组件行为来由分层层组成架构。
例如,在分层系统中,每个组件都无法看到它们正在与之交互的直接层之外。

4.6. 按需编码(可选)

REST 还允许通过以小程序或脚本的形式下载和执行代码来扩展客户端功能。
下载的代码通过减少需要预先实现的功能数量来简化客户端。服务器可以将部分功能以代码的形式交付给客户端,客户端只需要执行代码即可。

5. 什么是资源?

RESOURCE
URI:统一资源标识符,是一个字符串,用来标识互联网资源的名字
URL:统一资源定位符,他是一种具体的URI

REST 中信息的关键 抽象是资源。我们可以命名的任何信息都可以是资源。例如,REST 资源可以是文档或图像、时间服务、其他资源的集合或非虚拟对象(例如,人)。
资源在任何特定时间的状态称为 资源表示。
资源表示包括:
● 数据_
● 描述数据的 元数据
● 以及 可以帮助客户过渡到下一个所需状态的超媒体链接。
一个 REST API 由一组相互关联的资源组成。这组资源称为 REST API 的 资源模型。

5.1.资源标识符

REST 使用资源标识符来识别客户端和服务器组件之间交互中涉及的每个资源。

5.2. 超媒体

表示的数据格式称为 媒体类型。媒体类型标识了一个规范,该规范定义了如何处理表示。
RESTful API 看起来像 超文本。每个可寻址的信息单元都携带一个地址,或者显式(例如,链接和 id 属性)或隐式(例如,从媒体类型定义和表示结构派生)。
— 罗伊·菲尔丁
超文本(或超媒体)意味着 信息和控制的同时呈现, 使得信息成为用户(或自动机)获得选择和选择动作的可供性。
请记住,超文本在浏览器上不需要是 HTML(或 XML 或 JSON)。当机器了解数据格式和关系类型时,它们可以跟踪链接。

5.3. 自我描述

此外, 资源表示应该是自描述的:客户端不需要知道资源是员工还是设备。它应该根据与资源相关联的媒体类型进行操作。
所以在实践中,我们将创建许多 自定义媒体类型 ——通常是一种媒体类型与一种资源相关联。
每种媒体类型都定义了一个默认处理模型。例如,HTML 定义了超文本的呈现过程以及每个元素周围的浏览器行为。
媒体类型与资源方法没有关系获取/放置/删除/删除/ …除了某些媒体类型元素将定义类似于“具有href属性的锚元素创建一个超文本链接时,某些媒体类型元素的事实在对应于CDATA-encodedhref属性的 URI 上调用检索请求 (GET)。”

6. 资源方法

与 REST 相关的另一个重要的事情是 资源方法。这些资源方法用于在任何资源的两种状态之间执行所需的转换。
很多人错误地将资源方法与 HTTP 方法 (即 GET/PUT/POST/DELETE)相关联。Roy Fielding 从未提及任何关于在何种条件下使用哪种方法的建议。他所强调的只是它应该是一个 统一的界面。
例如,如果我们决定应用程序 API 将使用 HTTP POST 来更新资源——而不是大多数人推荐的 HTTP PUT——那没关系。尽管如此,应用程序界面仍将是 RESTful。
理想情况下,转换资源状态所需的一切都应该是资源表示的一部分——包括所有支持的方法以及它们将以何种形式离开表示。
我们应该输入一个 REST API,除了初始 URI(书签)和一组适合目标受众(即,任何可能使用 API 的客户端都可以理解)的标准化媒体类型之外,没有任何先验知识。
从那时起,所有应用程序状态转换必须由客户端选择的服务器提供的选项驱动,该选项存在于接收到的表示中,或者由用户对这些表示的操作暗示。
转换可以由客户端对媒体类型和资源通信机制的了解来确定(或限制),这两者都可以在运行中得到改进(例如, 按需编码)。[这里的失败意味着带外信息正在推动交互而不是超文本。]

7. REST和HTTP不一样

许多人更喜欢将 HTTP 与 REST 进行比较。 REST 和 HTTP 不一样。
REST!= HTTP
尽管 REST 还打算使 Web(互联网)更加精简和标准,但 Roy fielding 提倡更严格地使用 REST 原则。这就是人们尝试将 REST 与 Web 进行比较的地方。
Roy fielding 在他的论文中没有提到任何实现方向——包括任何协议偏好甚至 HTTP。到目前为止,我们都在遵守 REST 的六项指导原则,我们可以将其称为我们的接口——RESTful。

8. 总结

简而言之,在 REST 架构风格中,数据和功能被视为资源,并使用 统一资源标识符 (URI) 进行访问。
通过使用一组简单的、定义明确的操作对资源进行操作。此外,资源必须与其表示分离,以便客户端可以访问各种格式的内容,例如 HTML、XML、纯文本、PDF、JPEG、JSON 等。
客户端和服务器通过使用标准化的接口和协议来交换资源的表示。通常 HTTP 是最常用的协议,但 REST 并不强制要求它。
有关资源的元数据可用并用于控制缓存、检测传输错误、协商适当的表示格式以及执行身份验证或访问控制。
最重要的是,与服务器的每次交互都必须是无状态的。
所有这些原则都有助于 RESTful 应用程序变得简单、轻量和快速。

猜你喜欢

【PHP】php中?:与??运算符有什么不同?
在PHP 7中,有两个类似的语法结构:“??”和“?:”,它们都是用于处理条件判断和返回值的运算符。尽管它们看起来相似,但它们的作用和用法有一些区别。"?:"是三目运算符,语法格式为:$result = $test ? $test : ′ ′ ; 意思就是当test存在时(即empty($test)为false),则返回它本身,否则返回空(当然也可以返回其他,这里的空只是举个例子)。"??"是php7新引入的语法,它相当于是isset($result[‘k
发表于:2024-08-01 浏览:279 TAG:
【PHP】php魔术常量、超全局变量和魔术方法汇总
一、魔术常量(8个)PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。LINE:文件中 本常量所在行的 行号(即处于第几行)。FELE:本文件的完整路径和文件名。如果被用在 被包含文件中,则返回被包含文件的文件名。本常量总是包含一个绝对路径(如果是符号链接,则是解析后的绝对路径)DIR:本文件所在目录。如果被用在 被包含文件中,则返回被包含文件的所在目录。它等价于 dirname(FILE)。除非是根目录,否则目录名中不包含末尾的斜杠。F
发表于:2024-07-17 浏览:258 TAG:
【PHP】php-fpm调优方法详解
hp-fpm是一种常用的php进程管理器,用于提供更好的php性能和稳定性。然而,在高负载环境下,php-fpm的默认配置可能无法满足需求,因此我们需要对其进行调优。本文将详细介绍php-fpm的调优方法,并给出一些代码示例。一、增加进程数默认情况下,PHP-FPM只启动少量的进程来处理请求。在高负载环境下,我们可以通过增加进程数来提高PHP-FPM的并发处理能力。可以通过编辑php-fpm.conf文件来设置进程数。vi /etc/php-fpm.conf找到以下两个参数,并将其值
发表于:2024-06-21 浏览:237 TAG:
【PHP】PHP函数array_map()
在PHP的函数库中,有一款非常实用的函数,那就是array_map()函数。它可以将一个数组中的数据传递给某个函数进行处理,最终返回一个新的数组。array_map()函数可以极大地方便我们数据的处理,下面我们来详细介绍一下它的使用。一、array_map()函数的基本用法array_map()的基本语法格式为:array_map(callable $callback, array ...$arr)其中,$callback参数表示将要被调用的函数或方法,它和数组中的每一个元素一一对应。而$arr
发表于:2024-07-31 浏览:260 TAG:
【PHP】Your requirements could not be resolved to an installable set of packages.
在执行composer install或composer update的时候,出现Your requirements could not be resolved to an installable set of packages.这个错误,提示的是版本不兼容的问题执行一下命令即可composer install --ignore-platform-reqs 或 composer update --ignore-platform-reqs
发表于:2024-08-09 浏览:319 TAG:
【PHP】yaf框架的特点
Yaf(Yet Another Framework)是一个C语言编写的,针对Web开发的PHP框架。以下是Yaf的一些主要特征: 轻量级设计:Yaf的核心框架大小不超过100KB,运行时内存占用极小。 高性能:Yaf采用C语言编写,性能优秀,远高于纯PHP应用。 易用性:Yaf提供了自动加载类的功能,支持Bootstrap,配置简单。 插件机制:Yaf提供了一种类似于WordPress插件的插件机制,方便功能扩展。 路由功能:Yaf内置了路由功能
发表于:2024-07-01 浏览:273 TAG:
【RabbitMQ】RabbitMQ五种消息模型
‌RabbitMQ提供了五种消息模型,分别是基本消息模型、工作模型、Fanout订阅模型、Direct订阅模型和Topic订阅模型‌。这些模型在消息的发送、路由和消费方式上有所不同,适用于不同的应用场景。‌
发表于:2025-02-08 浏览:90 TAG: #RabbitMQ
【PHP】php7.4安装zipArchive,使用ZipArchive类的问题及解决方法
一、问题描述在开发过程中,有时会遇到PHP报错提示"Class ZipArchive not found",这是因为PHP的ZipArchive类没有被正确加载导致的。二、具体步骤及代码步骤1:确认环境在开始解决问题之前,我们需要确认一下当前环境是否满足使用ZipArchive类的要求。首先,我们需要检查PHP版本是否符合要求,一般来说,PHP版本需要大于等于5.2.0才能使用ZipArchive类。可以通过以下代码来检查PHP版本:<?php   
发表于:2024-01-31 浏览:344 TAG:
【PHP】php8的扩展arginfo生成工具之使用初体验
hp8提供了非常方便的扩展函数或类参数信息的生成工具。只需要维护一份xyz.stub.php,就可以使用工具生成 xyz_arginfo.h。毫无疑问,这种方式,又降低了广大 phper 开发扩展的门槛,更易维护。上手体验:生成扩展骨架。cd ext php ext_skel.php --ext test随便添加一个函数,更改 test.stub.php。<?php   /** @generate-function-entrie
发表于:2024-01-01 浏览:292 TAG:
【PHP】PHP判断PC、手机浏览器、微信浏览器、支付宝浏览器
PHP识别不同的请求,主要从请求头user_agent来区分比如PC端谷歌浏览器Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit.........Safari/537.36手机微信浏览器Mozilla/5.0 ............. MicroMessenger/8.0.42.2460(0x28002A51) WeChat/arm64 
发表于:2024-04-11 浏览:290 TAG: