Python学习
一、学前花絮
在实际工作中,我们编写的程序代码只是一个大的项目的一部分,而构成这个项目的各个部分之间需要API接口,这种情况属于项目内部接口。而对于一个用户单位来说,项目之间也不是孤立的,也就是说项目与其他应用之间,也会有API接口,这种情况属于项目外部接口。
而无论项目内部、项目外部的API接口到底指什么呢?
简单来说,API 就是软件之间的 “通信语言”,而我们常说的API 接口,是对这一通信规范的具体实现,也是开发中实际调用、开发的对象。
API 接口的分类维度有很多,按通信协议 / 架构风格是开发中最常用的分类方式,包含传统协议接口和现代 HTTP/HTTPS 基础接口两大阵营。传统协议接口包括TCP/UDP 接口,而现代HTTP/HTTPS基础接口主要包括普通HTTP接口和Restful接口。
本文针对普通HTTP接口和Restful接口进行比较并以python程序调用进行示例。
二、普通HTTP接口和Restful接口的区别及Python调用示例
2.1 普通HTTP接口和Restful接口介绍
HTTP 接口是基于 HTTP 协议实现的通用接口,是传输层面的基础实现;RESTful 接口是遵循 REST 架构风格的 HTTP 接口,是对 HTTP 接口的规范化、标准化设计,属于 HTTP 接口的 “优秀实践版本”。二者并非对立关系,RESTful 接口本质上是满足特定约束的 HTTP 接口,而普通 HTTP 接口则无架构风格的强制要求。
简单说,Restful接口包含在HTTP接口范围内,是它的子集。从另一个角度,RESTful 接口是遵循 REST 风格的 HTTP 接口,通过严格遵循 REST 的 6 大核心约束,实现接口的标准化、可扩展、松耦合。
2.2 二者的相同点
l底层协议一致:均基于 HTTP/HTTPS 协议实现,使用 HTTP 的基础组件(请求方法、URL、请求头、响应头、状态码、请求 / 响应体)进行通信;
l无状态特性:默认遵循 HTTP 的无状态原则,服务端不保存客户端的请求状态,每次请求都需携带完整的身份认证、参数等信息(可通过 Cookie、Token 实现状态保持,属于上层扩展);
l跨平台 / 跨语言:与开发语言、客户端 / 服务端架构无关,只要能解析 HTTP 协议,即可实现交互(如 Python、Java、前端 JS、Go 均可调用);
l支持多种数据格式:均可传输 JSON、XML、Form-Data、纯文本等数据格式,目前主流为 JSON;
l核心交互逻辑一致:均为 “客户端发起请求→服务端接收并处理→服务端返回响应” 的请求 - 响应模型。
2.3 二者的核心差异
普通 HTTP 接口无强制设计约束,而 RESTful 接口有严格的架构约束和设计规范,差异体现在请求方法、接口路径、状态码、资源操作、可扩展性等多个维度,以下是详细对比表:
补充:RESTful 的 6 大核心约束(普通 HTTP 接口无此要求),这是 RESTful 接口的 “硬性标准”,也是其与普通 HTTP 接口的本质区别:
- 客户端 - 服务端分离:客户端和服务端各司其职,服务端专注数据存储,客户端专注界面展示,降低耦合;
- 无状态:服务端不保存客户端状态,每次请求必须包含所有必要信息;
- 缓存:支持 HTTP 缓存(如 Cache-Control、ETag),减少重复请求,提升性能;
- 统一接口:这是最核心的约束,通过资源标识、资源表述、自描述消息、超媒体作为应用状态引擎(HATEOAS) 实现接口标准化;
- 分层系统:服务端可分层设计(如负载均衡、网关、业务层、数据层),客户端无需感知底层架构;
- 按需代码(可选):服务端可按需向客户端发送代码(如 JS),扩展客户端功能。
2.4 关键概念的补充说明
1.幂等性(RESTful 的核心设计点)
l幂等性:指多次执行相同的请求,得到的结果与执行一次完全一致,不会产生额外副作用;
lRESTful 的幂等性规则:
lGET:查询资源,多次查询结果一致,幂等;
lPUT:更新整个资源,多次更新最终结果一致,幂等;
lDELETE:删除资源,多次删除结果一致(删除后再删仍返回成功 / 404),幂等;
lPOST:创建资源,多次提交会创建多个资源,非幂等;
lPATCH:更新资源的部分字段,按需设计(一般建议实现幂等)。
普通 HTTP 接口通常忽略幂等性,比如一个/addUser的 POST 接口,多次提交会创建多个用户,引发业务问题。
2. 资源为核心(RESTful 的设计思维)
RESTful 的核心是把一切交互对象都视为 “资源”(如用户、订单、商品),资源有唯一的 URL 标识,所有操作都是对资源的 “增删改查”,而普通 HTTP 接口的核心是“动作”(如添加、删除、修改、查询),接口路径直接包含动作,这是二者设计思维的本质区别。
2.5 Python 调用示例
假设我们要实现一个“获取用户信息”的功能。
注意:为了演示,我假设了两个不存在的服务器地址。代码逻辑是通用的,你需要安装 requests 库:pip install requests。
1. 调用传统 HTTP 接口
场景:接口文档规定,要获取用户,必须调用 get 这个接口,并传入 userId 参数。
以上代码,细心的朋友会发现,为了美化输出,我们用了pprint。因为response的响应文件是json格式,记录了很多的信息,如果只是用一般的print,很长的一行超出屏幕。Pprint自动按照json的key-value进行美化输出。输出结果:
2. 调用 RESTful API
场景:接口文档规定,用户资源的路径是 /users。要获取特定用户,直接在路径后加 ID,并使用 POST 方法。
以上代码中,对应response的json数据再一部细化处理,只返回我们需要的部分数据,这种处理方法更精细化。输出结果:
2.6 以上内容的总结
相同点:底层传输协议都是 HTTP/HTTPS,Python 调用它们的代码几乎看不出区别(都是用 requests.get() 或 requests.post())。
不同点:接口的设计规范。
传统接口:像打电话给客服说“帮我查一下 123 的订单”,动作和对象混在一起。
RESTful 接口:像去快递柜取件,柜子(服务器)知道 /users/123 这个格子代表用户 123,你用 GET 动作就是取件,用 DELETE 动作就是清空。
建议:在现代开发中,如果后端提供了 RESTful 风格的接口,尽量遵循它的规范(用对 HTTP 方法),这样代码的可读性和维护性会更好。
三、小结
通过了解API接口的含义并针对普通HTTP接口与Restful接口进行比较,结合python程序调用二种接口的示例,我们更深入了解到这两种接口的异同。接口本质上就是对程序代码的解耦合,为什么要解耦合?
是因为现代工程项目分工的需要,一个工程项目不太可能是一个人开发,要和很多人、很多的应用模块或者其他项目进行数据交互,比如最常见的前后端分离。如果不解耦的话,你的程序代码与其他人的程序代码密切相关,改动起来会影响别人,最终影响整个项目的开发进度。
让我们保持学习热情,多做练习。我们下期再见!