什么是RESTful接口,今天彻底搞懂它

虽然这段时间在做iOS UI 自动化,但是在UI自动化中也需要请求后端的接口,通过接口返回的数据来定位或者寻找页面上的元素,这次顺便总结一下关于RESTful接口的内容。

在日常工作中总是听到RESTfull接口,那到底什么是TESTfull类型的接口呢?今天捋一捋,彻底弄明白它。


RESTful 接口是基于 REST(Representational State Transfer) 架构风格设计的 Web API 接口。它使用 HTTP 协议中的方法(如 GET、POST、PUT、DELETE)来操作资源,并遵循一系列约定,使得接口具有一致性、简洁性和可扩展性。


那ful是什么意思呢?
ful 是一个英语形容词后缀,用来表示某物“充满”或“具备”某种特征。在 RESTful 中,它只是用来形容符合 REST 设计原则和约束的系统或 API。所以,RESTful 并不代表一个单独的语法格式,而是指“完全遵循 REST 架构风格的”。例如,Helpful(有帮助的)——具有帮助性质的。这样的话就清晰多了,不然总以为ful也代表哪种类型呢。


接下来细聊聊RESTful:

【核心原则】
1、资源导向
一切皆资源,资源可以是数据(如用户、订单)或服务(如上传图片)。
每个资源通过唯一的 URI 表示(如 /users/123 表示 ID 为 123 的用户)。


2、无状态
客户端的每个请求都是独立的,服务器不会保存客户端的上下文信息。
请求必须包含完成操作所需的所有信息(如认证信息)。


3、统一接口
使用统一的 HTTP 方法操作资源:
GET: 获取资源。
POST: 创建资源。
PUT: 更新资源。
DELETE: 删除资源。
避免在接口中出现额外的动词(如 /getUser,应改为 /users/{id})。


4、表现层状态转换(HATEOAS)
响应中包含相关链接,帮助客户端发现可用的操作(非强制)。
例如,获取用户时可以返回更新链接:

{
  "id": 123,
  "name": "John",
  "links": {
    "update": "/users/123",
    "delete": "/users/123"
  }
}

5、面向客户端的缓存
响应应标明是否可缓存,减少不必要的请求(如使用 Cache-Control)。


6、分层系统
客户端无需知道服务器的内部细节,服务器可以通过负载均衡、代理等方式优化性能。


【RESTful 接口的设计规范】
1、URI 设计
使用名词表示资源。
资源名使用复数形式(如 /users 而非 /user)。
层级关系通过路径表示(如 /users/{id}/posts 表示用户的帖子)。

GET    /users             获取所有用户
GET    /users/123         获取 ID 为 123 的用户
POST   /users             创建用户
PUT    /users/123         更新 ID 为 123 的用户
DELETE /users/123         删除 ID 为 123 的用户

2、HTTP 状态码
使用标准 HTTP 状态码表示请求结果:
200 OK:请求成功。
201 Created:资源创建成功。
204 No Content:删除成功,无返回内容。
400 Bad Request:请求参数有误。
401 Unauthorized:未授权。
404 Not Found:资源不存在。
500 Internal Server Error:服务器内部错误。


3、请求和响应格式
推荐使用 JSON 格式传输数据。
示例请求(创建用户):

{
  "name": "John",
  "email": "[email protected]"
}

示例响应(获取用户):

{
  "id": 123,
  "name": "John",
  "email": "[email protected]",
  "created_at": "2024-01-01T10:00:00Z"
}

4、过滤、排序、分页
提供查询参数支持数据筛选:

GET /users?age=30&country=US
GET /users?sort=created_at&order=desc&page=1&size=10

5、版本控制
可以通过 URL 或请求头实现:
URL:/v1/users
Header:Accept: application/vnd.example.v1+json


【RESTful 的优缺点】
优点
1、简单明了:
基于 HTTP 协议,易于理解和实现。
2、跨平台兼容:
无需依赖特定技术,支持多种语言和框架。
3、可扩展性:
分层架构支持大规模系统的扩展。
4、清晰的接口语义:
HTTP 方法与状态码约定明确,减少客户端开发成本。


缺点
1、无状态:
对于复杂的交互,可能需要客户端重复传递上下文信息。
2、效率问题:
不支持批量操作,多次请求可能增加延迟。
3、实现 HATEOAS 较复杂:
很多 RESTful 接口未完全遵循 HATEOAS 原则。


【示例代码】
后端示例(使用 Flask)

from flask import Flask, request, jsonify

app = Flask(__name__)

users = {
    123: {"name": "John", "email": "[email protected]"}
}

@app.route('/users', methods=['GET'])
def get_users():
    return jsonify(users)

@app.route('/users/', methods=['GET'])
def get_user(user_id):
    user = users.get(user_id)
    if user:
        return jsonify(user)
    return {"error": "User not found"}, 404

@app.route('/users', methods=['POST'])
def create_user():
    data = request.json
    new_id = max(users.keys()) + 1
    users[new_id] = data
    return jsonify({"id": new_id, "data": data}), 201

if __name__ == '__main__':
    app.run(debug=True)

客户端请求示例(Python)

import requests

# 获取用户列表
response = requests.get('http://127.0.0.1:5000/users')
print(response.json())

# 创建新用户
new_user = {"name": "Jane", "email": "[email protected]"}
response = requests.post('http://127.0.0.1:5000/users', json=new_user)
print(response.json())

【RESTful 的相关技术】
GraphQL:REST 的替代方案,更灵活,允许客户端指定需要的字段。
OpenAPI(Swagger):用于描述 RESTful 接口的标准文档格式。
gRPC:高效的二进制通信协议,适合高性能服务调用。

RESTful 接口是现代 Web 开发的基础,虽然它并不是唯一的选择,但其简单性和通用性让它在众多应用中占据主导地位。

现在我们知道了什么是RESTfull风格的接口,那么哪些是不遵循RESTfull接口的类型呢?

不遵循 RESTful 规范的接口类型主要包括:
1、SOAP:基于 XML 的 Web 服务,结构严谨但较重。
2、GraphQL:允许客户端指定请求的数据字段,灵活但不符合 REST 的约束。
3、RPC:远程过程调用,不依赖 HTTP 的动词。
4、WebSocket:持久化连接协议,适用于实时通信。
5、JSON-RPC 和 XML-RPC:基于远程方法调用的轻量协议。
6、AJAX:异步通信技术,通常与 RESTful API 配合使用,但不构成完整的接口设计方法。

你可能感兴趣的:(iOS,UI,自动化,Appium,pytest,python,restful,后端,ios,ui,自动化)