接口的定义
API(Application Programming Interface)接口是前端和后端之间通信的桥梁,定义了数据交换的规则和格式。
一、API请求格式
1. 请求URL(Request URL)
- 协议:http/https
- 域名:api.example.com
- 路径:/api/v1/users/123
- 端口:可选,如 :8080 其中
- 路径(Path) :接口的主路径,通常与资源的标识符(ID)相关。例如:
/api/users:获取所有用户。/api/users/123:获取ID为123的用户信息。
- 查询参数(Query Parameters):附加在URL后的键值对,用于过滤、分页等。
/api/users?page=2&limit=10:获取第2页,每页10个用户。
2. 请求方法(HTTP Methods)
- GET:获取数据,参数在URL中
- POST:创建新数据,参数在请求体中
- PUT:完整更新数据
- PATCH:部分更新数据
- DELETE:删除数据
- OPTIONS:获取当前资源的支持的HTTP方法,通常用于跨域请求时,浏览器会自动发起OPTIONS请求来确认服务器支持的请求方法。
3. 请求头(Request Headers)
{ 'Content-Type': 'application/json', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', 'Accept': 'application/json', 'User-Agent': 'Mozilla/5.0...' }
Content-Type:告诉服务器请求体的数据格式。常见的格式包括:
- application/json:请求体是JSON格式数据。
- application/x-www-form-urlencoded:传统表单提交格式。
- multipart/form-data:用于文件上传。
- text/plain:纯文本数据。
Authorization:用于身份验证,通常包含JWT或其他Token。
- Bearer :用于传递Bearer Token,例如JWT。
Accept:告诉服务器客户端期望接收的响应格式。例如:
- application/json:客户端希望服务器返回JSON格式的响应。
- application/xml:客户端希望服务器返回XML格式的响应。
- User-Agent:客户端的应用信息,可以用来标识发起请求的客户端设备或浏览器。
- X-Requested-With:通常用于标识Ajax请求,避免浏览器与非浏览器请求混淆。
- Origin:在跨域请求中,表示发起请求的源(来源)。
4. 请求参数
查询参数(Query Parameters)- GET请求
路径参数(Path Parameters)
5. 请求体(Body)
请求体是通过POST、PUT、PATCH等方法发送给后端的数据。请求体的格式通常依赖于Content-Type。
JSON:常用于现代Web应用,格式清晰,易于理解。 Form Data:用于传统的表单提交,尤其是在上传文件时。 XML:用于数据交换较为复杂的应用,但如今不如JSON流行 Multipart Form Data:主要用于文件上传。
二、API响应格式
1. 响应头(Headers)
响应头包含关于响应的元数据。常见的响应头字段包括:
-
Content-Type:告诉客户端响应体的数据格式。例如:
- application/json:响应体为JSON格式数据。
- text/html:响应体为HTML格式数据。
-
Cache-Control:控制缓存策略,例如:
- no-cache:不缓存该响应。
- max-age=3600:缓存一小时。
-
Location:在创建资源时(如POST请求),如果资源被创建,服务器通常会返回该字段,指示新资源的URL。
2. 响应结构(Response)
响应状态码
- 200:成功
- 201:创建成功
- 400:请求参数错误
- 401:未授权
- 403:禁止访问
- 404:资源不存在
- 500:服务器错误
3. 响应体(Body)
响应体是服务器返回给客户端的数据,通常使用JSON格式进行交换。下面是一些常见的响应体格式:
JSON格式:通常包含status、message、data等字段,用于表示请求的处理结果和相关数据。
{ "status": "success", "message": "User created successfully", "data": { "userId": 123, "username": "john_doe" } }
错误响应:当请求出现错误时,响应体通常会包含错误的详细信息。
{ "status": "error", "message": "Invalid username or password" }
空响应:如果请求成功但不需要返回数据,响应体可以为空。 {}
分页数据:当返回的数据需要分页时,响应体会包含分页信息。
{ "status": "success",
"message": "Users fetched successfully",
"data": [ {"userId": 1, "username": "john_doe"},
{"userId": 2, "username": "jane_doe"} ],
"pagination": { "page": 1, "limit": 10, "total": 100 } }
补充
1. response.data 的用法
response.data 是最常见的用法,它指的是后端返回的响应体。在大多数情况下,后端返回的数据直接位于 data 字段中。
-
场景 1:响应结构直接包含数据
假设后端返回的响应结构如下:
{ "status": "success", "message": "Operation successful", "data": { "userId": 1, "username": "john_doe" } }在这种情况下,前端在接收到响应后,可以直接访问
response.data获取响应体中的data部分。即:javascript 复制编辑 axios.get('/api/user') .then(response => { console.log(response.data); // { "userId": 1, "username": "john_doe" } });这里的
response.data是整个响应对象,它包含了status,message, 和data等字段。如果你直接需要data字段中的数据,通常可以这么做:axios.get('/api/user') .then(response => { console.log(response.data.data); // { "userId": 1, "username": "john_doe" } });
2. response.data.data 的用法
response.data.data 适用于后端响应结构的 data 字段内部再包含一层 data 数据的情况。这种情况通常用于分页或者返回多个数据集合的响应。
-
场景 2:响应结构内嵌数据
假设后端返回的响应结构如下:
{ "status": "success", "message": "Fetched users successfully", "data": { "page": 1, "limit": 10, "total": 50, "data": [ { "userId": 1, "username": "john_doe" }, { "userId": 2, "username": "jane_doe" } ] } }在这个结构中,
data字段本身包含了分页信息和数据数组,并且这个数据数组实际上是嵌套在data字段下的data字段中。所以你需要访问response.data.data来获取真正的数据内容。例如:
javascript 复制编辑 axios.get('/api/users') .then(response => { console.log(response.data.data); // [ { "userId": 1, "username": "john_doe" }, { "userId": 2, "username": "jane_doe" } ] });这里的
response.data是响应体,其中包含了分页信息和数据集合,而实际的数据集位于data.data中。