专栏/RESTful 编写标准 API 接口

RESTful 编写标准 API 接口

2022年04月12日 08:04--浏览 · --点赞 · --评论
IT老鸟-老王
粉丝:99文章:1




第 1 章 了解 HTTP 协议

1.1 前言

我们现实生活中的协议是指相互遵守的规定,单方面违背,协议不成立。

而在互联网交互的过程中,也存在这许多协议,例如 FTP、HTTP、STMP、TCP/IP等。

而 HTTP 协议则是 web 服务器web 客户端达成的一种可靠的数据传输协议,通过 HTTP 可以从遍布全世界的 Web 服务器上将  JPEG 图片,HTML 页面,文本文件,MPEG 电影,WAV 音频文件和其他资源信息块迅速、便捷、可靠地搬移到人们桌面上的 Web 浏览器上去。它能够确保数据在传输的过程当中不会损坏或者产生混乱。这样,对用户来说是个好事,同样对 Internet 应用的开发人员来说也是一件好事。因为我们在开发过程中也不需要担心自己的页面和数据会在传输过程中发生破坏和畸变了。

1.2 WEB客户端和服务器

Web 内容都是存储在 Web 服务器上的。Web 服务器所使用的是 HTTP 协议,因此经常会被称为 HTTP 服务器。这些 HTTP 服务器存储了因特网中的数据,如果 HTTP 客户端发出请求的话,它们会提供数据。客户端向服务器发送 HTTP 请求,服务器会在 HTTP 响应中回送所请求的数据。

那么一次请求和响应的过程中发生了什么?


客户端与服务器之间的请求和响应图


HTTP 属于无状态链接协议,即是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间和服务器资源。

当然也有有状态连接,那就是我们常用的 QQ。H5 新增的特性中也包含 Websocket 帮助我们构建长链接。

1.3 资源和媒体类型

web 服务器是web 资源的宿主,而 web 资源就是我们常见的 web 内容的源头,最简单的 web 资源就是我们服务器中的静态文件:文本文件,HTML 文档,JPEG 图片文件,AVI 文件等等。

当然 web 资源也可以是动态生成的,类似搜索引擎生成的页面,QQ 空间的动态等,总之,所有类型的内容来源都是资源。

因特网上有数千种不同类型的数据类型,HTTP 在传输的过程中为每个传输的数据都打上了名为 MIME 类型的数据类型标签,描述并标记多媒体内容。

MIME类型识别

web 浏览器请求一个网站的时候往往会发布多个 HTTP 请求,比如我们在浏览一个具有丰富图片的的 web 页面的时候,浏览器会执行一次 HTTP 请求来获取描述页面布局的 HTML,然后发布另外的请求来获取每个嵌入式的图片,这些图片甚至可能位于不同的服务器上。因此,一个 web 页面通常不是单个资源,而是一组资源的集合。

web 服务器会为所有的 HTTP 对象数据附加一个MIME 类型,当浏览器从服务器中取回一个对象的时候,会查看相关的 MIME 类型。看看它是否知道应该如何处理这个对象。对象的类型写在响应的 content-type 头中;同样,请求的时候浏览器也会告知服务器请求数据类型。

常见的 MIME 类型:

  • HTML 格式的文本文档由 text/html 类型来标记。

  • 普通的 ASCII 文本文档由 text/plain 类型来标记。

  • JPEG 格式的图片为 image/jpeg 类型。

  • GIF 格式的图片为 image/gif 类型。

以 application 开头的媒体格式类型:

  • application/xhtml+xml :XHTML 格式

  • application/xml :XML 数据格式

  • application/atom+xml:Atom XML 聚合格式

  • application/json:JSON 数据格式

  • application/octet-stream:二进制流数据(如常见的文件下载)

  • application/x-www-form-urlencoded<form encType=''>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

  • multipart/form-data:需要在表单中进行文件上传使用的数据格式。

MIME 参考手册:W3school MINE类型

1.4 URL

统一资源定位符(Uniform Resource Locator)是资源标识符最常见的形式。URL 描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。

互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

大部分 URL 都遵循一种标准格式, 这种格式包含三个部分。

  • URL 的第一部分被称为方案(scheme), 说明了访问资源所使用的协议类型。 这部 分通常就是 HTTP 协议(http://)。

  • 第二部分给出了服务器的因特网地址(比如,http://www.itheima.com)。

  • 其余部分指定了 Web 服务器上的某个资源(比如, /static/image/common/zixuelogo.png)。

URL 可以更为细致的进行划分。

扩展:URI、URL、URN 的区别

URI = Uniform Resource Identifier 统一资源标志符URL = Uniform Resource Locator 统一资源定位符URN = Uniform Resource Name 统一资源名称

翻译成人话: URI 是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫 URI,本来设想的的使用两种方法定位。  1)URL 用地址定位  2)URN 用名称定位

举个例子:去村子找个具体的人(URI)。如果用地址:某村多少号房子第几间房的主人就是 URL, 如果用身份证号 + 名字,去找就是 URN 了。

目前 WEB 上就 URL 流行开了,平常见得 URI  基本都是 URL。

URI、URL、URN 的区别

扩展:HTTP 和 HTTPS 协议的区别

1)HTTP 和 HTTPS 的相同点

2)HTTP 和 HTTPS 的不同之处

  • HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头

  • HTTP 是不安全的,而 HTTPS 是安全的

  • HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443

  • 在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层

  • HTTP 无需加密,而 HTTPS 对传输的数据进行加密

  • HTTP 无需证书,而 HTTPS 需要认证证书

3)如何选择 HTTP 和 HTTPS 协议

1.5 方法

HTTP 支持几种不同请求和命令,这些命令被称为 HTTP 方法,每条 HTTP 请求报文都包含一个方法。 这个方法会告诉服务器要执行什么动作(获取一个 Web 页面、发送一段信息、删除一个文件等)。

我们在学习 form 表单的时候也知道 method 可以写作 post 和 get。这就是 HTTP 请求的方法。

请求方法如下:

常用部分请求方法

1.6 状态码

每条 HTTP 响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功, 或者是否需要采取其他动作。

状态码分成如下几个系列:

状态码系列

常见的 HTTP 状态码:

常用状态码

1.7 报文

HTTP 报文是由一行一行的简单字符串组成的。HTTP 报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。

请求和响应报文

从 Web 客户端发往 Web 服务器的 HTTP 报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message)。

HTTP 报文包括以下三个部分:

  • 起始行报文的第一行就是起始行, 在请求报文中用来说明要做些什么, 在响应报文中说明 出现了什么情况。

    • 请求行部分由 请求方法(GET,POST等),请求路径,协议版本组成。

    • 响应行部分由 协议版本,状态码,状态文字组成。

  • 首部字段起始行后面有零个或多个首部字段。 每个首部字段都包含一个名字和一个值, 为了 便于解析, 两者之间用冒号来分隔。 首部以一个空行结束。

  • 主体空行之后就是可选的报文主体了, 其中包含了所有类型的数据。 请求主体中包括了 要发送给 Web 服务器的数据; 响应主体中装载了要返回给客户端的数据。 起始行 和首部都是文本形式且都是结构化的, 而主体则不同, 主体中可以包含任意的二进 制数据(比如图片、视频、音轨、软件程序)。 当然, 主体中也可以包含文本。

1.7.1 请求头(Requests)部分

请求头部分参数

1.7.2 响应头(Responses)部分

响应头部分参数


使用火狐和 chrome 浏览器打开一个网页,找到其中一个网络请求查看报文。

1.8 推荐书籍

图解HTTP协议,入门经典图书

第 2 章 了解 API 接口

俗话说,无规矩不成方圆,为了让前后端更好的分离,写好每一个 API 接口是开发必备的技能,开发刚开始兴起的那些年,接口并未固定的规范,随着开发人数的不断扩大,配合问题成为大问题,接口的规范也就变得特别紧迫。    不管是什么开发,只要是基于互联网的,就必须考虑多人合作,共同开发的效率的问题。举个例子:我们有个 Python 库,可以处理图片的识别,你在代码中可以把图片路径直接写死,但我的图片是从摄像头过来的,是视频,你告诉人家,你必须给我图片,而且还得放在我自己的电脑上的固定文件夹里?

第 3 章 RESTful 风格

Roy Thomas Fielding 演讲

Roy Thomas Fielding 博士是一个非常重要的人,他是 HTTP 协议(1.0版和1.1版)的主要设计者、Apache 服务器软件的作者之一、Apache 基金会的第一任主席。

早期有复杂的 SOAP 和 XML-PRC 规范, 2000 年 Fielding 发布论文Architectural Styles and the Design of Network-based Software Architectures 中重新对网络中数据传输进行重新定义,即表现层状态转换,俗称 RESTREST 是设计风格而不是标准。

API 云端一体
目前几乎都在使用 RESTful 作为接口标准


REST 通常基于HTTP、URI、XML以及HTML这些现有的广泛流行的协议和标准。下面是截取维基百科关于 REST 的要点以及标准,更多说明参考:表现层状态转换 REST(需要 VPN)。

  • 资源是由 URI 来指定。

  • 对资源的操作包括获取、创建、修改和删除,这些操作正好对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE方法。

  • 通过操作资源的表现形式来操作资源。

  • 资源的表现形式则是 XML 或者 HTML,取决于读者是机器还是人、是消费 Web 服务的客户软件还是 Web 浏览器。当然也可以是任何其他的格式,例如 JSON。只是我们见多了,觉得 JSON 好像是规定一样,其实不然,返回可以是多样的。

对于 Web 服务应用领域,符合 REST 设计风格的 Web API 称为RESTful API。它从以下三个方面资源进行定义。

  • 直观简短的资源地址:URI,比如:http://example.com/resources

  • 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,HTML等。

  • 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。

第 4 章 实战编写 API 接口

接口规范说起来大,其实也就那么几个部分,接口规范(RESTful)接口管理工具(阿里 RAP)接口文档编写(demo 示例),下面就根据以上这几个部分分别进行实战。

4.1 接口规范

1)协议

为了确保不同系统/模块间的数据交互,需要事先约定好通讯协议,如:TCP、HTTP、HTTPS 协议。为了确保数据交互安全,建议使用 HTTPS 协议。刚开始练习写接口的时候可忽略这一条。

2)域名

应该尽量将 API 部署在专用域名之下。

如果确定 API 很简单,不会有进一步扩展,可以考虑放在主域名下。

3)接口版本控制规范

为了便于后期接口的升级和维护,建议在接口路径中加入版本号,便于管理,实现接口多版本的可维护性。如果你细心留意过的话,你会发现好多框架对外提供的 API 接口中,都带有版本号的。如:接口路径中添加类似v1v2等版本号。Github 采用这种做法。

格式规范如下:


更新版本后可以使用 v2、v3 等依次递加。

4)接口路径规范

路径又称终点(endpoint),表示 API 的具体网址。    在 RESTful 架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以 API 中的名词也应该使用复数。举例来说,有一个 API 提供动物园(zoo)的信息,还包括各种动物种类和雇员的信息,则它的路径应该设计成下面这样。

格式规范如下:


5)接口命名规范

具体接口命名也要规范些,可使用驼峰命名法按照实现接口的业务类型、业务场景等命名,有必要时可采取多级目录命名,但目录不宜过长,两级目录较为适宜。

格式规范如下:


6) HTTP 请求方法

接口路径中包含具体接口名称的名词,接口数据操作动作以HTTP请求方式来区分。常用的HTTP请求方式有如下:  GET:从服务器取出资源(一项或多项)  POST:在服务器新建一个资源  PUT:在服务器更新资源(更新全部资源)  PATCH:在服务器更新资源(更新局部资源)  DELETE:从服务器删除资源

格式规范如下:

  •   GET https://api.xxxxx.com/v1/zoos:列出所有动物园 

  •   POST https://api.xxxxx.com/v1/zoos:新建一个动物园 

  •   GET https://api.xxxxx.com/v1/zoos/ID:获取某个指定动物园的信息 

  •   PUT https://api.xxxxx.com/v1/zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息) 

  •   PATCH https://api.xxxxx.com/v1/zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息) 

  •   DELETE https://api.xxxxx.com/v1/zoos/ID:删除某个动物园 

  •   GET https://api.xxxxx.com/v1/zoos/ID/animals:列出某个指定动物园的所有动物 

  •   DELETE https://api.xxxxx.com/v1/zoos/ID/animals/ID:删除某个指定动物园的指定动物

注意:修改有两个方法 PUT 和 PATCH。

假设 URL 位置有一组数据 UserInfo,包括 UserID、UserName 等 20 个字段 

需求:用户修改了 UserName,其他不变    

  • 采用 PATCH,仅向 URL 提交 UserName 的局部更新请求   

  • 采用 PUT,必须将所有 20 个字段一并提交到 URL,未提交字段被删除

PATCH 的最主要好处:节省网络带宽


7)接口信息过滤

如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果。

格式规范如下: 

  • ?limit=10:指定返回记录的数量 

  • ?offset=10:指定返回记录的开始位置。 

  • ?page=2&perpage=100:指定第几页,以及每页的记录数。 

  • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 

  • ?animaltype_id=1:指定筛选条件

参数的设计允许存在冗余,即允许 API 路径和 URL 参数偶尔有重复。比如,GET /zoo/ID/animalsGET /animals?zoo_id=ID的含义是相同的。


8)请求参数规范

  • 请求方式: 按照 GET、POST、PUT 等含义定义,避免出现不一致现象,对人造成误解、歧义。

  • 请求头: 请求头根据项目需求添加配置参数。如:请求数据格式,accept=‘application/json’等。如有需要,API 的身份验证应该使用OAuth 2.0 框架 ,也可以参考:一张图搞定 OAuth 2.0。前期可不设置,随着 API 的开放程度,再决定是否要带 token、唯一验证码等。

  • 请求参数/请求体:

9)接口返回数据

统一规范返回数据的格式,对己对彼都有好处,此处以 JSON 格式为例,XML 等格式已经过时。

返回数据应包含:返回状态码、返回状态信息、具体数据。

格式规范如下:


status::接口的执行状态


data:接口的主数据


msg:返回成功或者失败的错误信息


返回数据中的状态码、状态信息,常指具体的业务状态,不建议和 HTTP 状态码混在一起。HTTP 状态,是用来体现 HTTP链路状态情况,如:404-Not Found。HTTP 状态码和 JSON 结果中的状态码,并存尚可,用于体现不同维度的状态。


4.2 实战编写 API 接口

从接口的地址能看出来,有的是用框架做的,有的是单纯放在服务上的某个文件。哪种方式,都不重要,适合当前的业务需求,才是重点。使用框架,能系统性的组织接口目录,甚至轻松设置各种权限,且分离逻辑层和数据层。

这里我们使用 Python 的 Flask 框架,遵守上面的所有的要求,编写一组有关图书的 API。

简单的功能如下:

  • 图书列表返回

  • 返回指定图书的信息(书名,价格,作者)

  • 新增一本书

  • 删除一本书

  • 更新书本的信息(涨价了)



4.3 编写 API 文档

合格的 API 文档,不光是自己看着舒服,用着舒服,对接到其他团队,也是非常愉快的事情。当然,有很多接口工具,我们还没到那个阶段,工具是团队人数达到一定规模,API 经常维护,找个平台统一更新接口说明,现阶段,从基本的手写练习。

参考新浪开放平台https://open.weibo.com,基本是国内最为标准的 API 文档之一。



投诉或建议

玻璃钢生产厂家北京玻璃钢卡通雕塑公司黑色小型玻璃钢花盆盘龙区玻璃钢雕塑制作加工曲靖玻璃钢花盆厂家直销嘉兴仿铜西式玻璃钢雕塑玻璃钢动物雕塑怎么买铸造玻璃钢景观雕塑制作厂家玻璃钢雕塑底座破损怎么修复拉丝玻璃钢雕塑省钱合肥玻璃钢雕塑定做厂家博爱玻璃钢雕塑上海玻璃钢雕塑卡通玻璃钢仿铜雕塑浮雕壁画武汉玻璃钢智能雕塑深圳艺术泡沫玻璃钢雕塑商场美陈总结苏州盐城玻璃钢雕塑商场秋天美陈照相背景图片四川步行街玻璃钢雕塑订做价格昆明抽象玻璃钢雕塑销售电话玻璃钢鸡腿雕塑济宁卡通玻璃钢雕塑卡通人玻璃钢雕塑摆件设计揭阳玻璃钢动物雕塑费用新郑铜玻璃钢雕塑福建玻璃钢雕塑销售上海定制玻璃钢雕塑性价比出众蒙城五一商场美陈淘宝玻璃钢花盆模具浙江室内商场美陈订购香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化