Skip to content

HTTP 与 RESTful

HTTP 是前端和后端之间的"共同语言"。理解 HTTP,联调时就不会瞎猜。

一、一次请求长什么样

POST /api/order HTTP/1.1                 ← 请求行:方法 + 路径 + 协议版本
Host: api.mall.com                       ← 请求头
Authorization: Bearer eyJhbGci...        ← 认证令牌(JWT)
Content-Type: application/json           ← 告诉后端发的是 JSON

{"productId": 1, "count": 2}             ← 请求体(body)

后端返回:

HTTP/1.1 200 OK                          ← 状态行
Content-Type: application/json

{"code": 0, "message": "下单成功", "data": {"orderId": 1024}}

二、请求方法(动词)

方法语义商城中的例子
GET查数据(不改变服务器状态)查商品列表
POST新增数据注册、登录、下单
PUT整体更新修改商品(全量替换)
PATCH部分更新修改购物车数量
DELETE删除删除购物车条目

幂等性(面试点)

GET/PUT/DELETE 是幂等的——调用一次和调用一百次结果一样。POST 不是。这也是为什么"扣库存"这类操作一般不直接用 POST 重复调用。

三、状态码(必背)

状态码含义典型场景
200成功正常返回
201已创建下单成功
400请求参数错误缺字段、格式不对
401未认证没登录 / token 过期
403无权限普通用户访问管理接口
404资源不存在商品 id 不存在
500服务器内部错误后端异常(看日志排查)

前端联调的第一件事:看状态码定位问题在谁。401/403 多半是前端没带 token;400 是参数问题;500 是后端代码问题。

四、RESTful 风格设计接口

REST 主张"用 URL 表示资源,用方法表示操作",本教程商城 API 全部遵循:

资源操作接口
商品查询列表GET /api/product/list?keyword=&page=1&size=10
商品查询详情GET /api/product/{id}
购物车查询我的GET /api/cart
购物车新增POST /api/cart
购物车删除条目DELETE /api/cart/{cartItemId}
订单下单POST /api/order

设计要点:

  • 名词复数表示资源:/products/orders
  • 查询参数用于过滤/分页:?page=1&size=10&keyword=手机
  • 嵌套关系用路径层级:/api/order/{id}
  • 版本前缀:/api/v1/...,本教程用 /api

五、前后端统一返回结构(企业标配)

后端所有接口返回统一 JSON 结构,前端才能统一处理:

json
{
  "code": 0,
  "message": "success",
  "data": { }
}
  • code === 0 表示成功(很多公司用 0 而不是 200 做业务码)。
  • 失败时 code !== 0message 给出人类可读的错误。
  • data 是业务数据,类型随接口变化。

前端封装请求时,统一在返回层拦截错误并提示:

ts
// 伪代码:前端 axios 请求拦截
const res = await http.get('/api/product/list')
if (res.code === 0) {
  return res.data
} else {
  ElMessage.error(res.message)   // 提示后端返回的错误信息
}

六、跨域(CORS)

浏览器有个安全限制:同源策略——默认情况下 http://localhost:5173 的前端页面,不能直接请求 http://localhost:8080 的后端接口(端口不同即跨域)。

解决方案(后端开 CORS):

java
// Spring Boot 全局跨域配置(第 6 部分详讲)
ts
// 开发阶段也可以用 Vite 代理,第 4 部分会配置
server: {
  proxy: { '/api': 'http://localhost:8080' }
}

本章小结

联调时你只需要三件事:看请求方法对不对、看状态码、看返回结构 code/message/data。其余都在框架里帮你封装好了。

基于 MIT 协议发布,可自由学习与修改