RESTful API 进阶
认证和授权
JWT (JSON Web Token) 认证
JWT 就像是一张"数字身份证",包含了用户的身份信息,并且可以验证真伪。
// JWT 的结构 // Header.Payload.Signature // 登录流程 POST /api/auth/login { "email": "user@example.com", "password": "password123" } // 响应 { "success": true, "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": 123, "name": "张三", "email": "user@example.com" } } } // 后续请求携带 Token GET /api/users/profile Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
OAuth 2.0 集成
// 第三方登录流程 GET /api/auth/google/redirect // 重定向到 Google 授权页面 // 回调处理 GET /api/auth/google/callback?code=authorization_code // 返回应用 Token API 限流和配额 请求频率限制 javascript// 响应头中包含限流信息 HTTP/1.1 200 OK X-RateLimit-Limit: 1000 // 每小时限制1000次请求 X-RateLimit-Remaining: 999 // 剩余请求次数 X-RateLimit-Reset: 1642694400 // 重置时间戳 // 超出限制时的响应 HTTP/1.1 429 Too Many Requests { "success": false, "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "请求过于频繁,请稍后再试", "retryAfter": 3600 // 建议等待时间(秒) } }
数据缓存策略
HTTP 缓存头
// 设置缓存策略 GET /api/users/123 Cache-Control: public, max-age=3600 // 缓存1小时 ETag: "a1b2c3d4e5f6" // 资源版本标识 // 条件请求 GET /api/users/123 If-None-Match: "a1b2c3d4e5f6" // 如果资源未变化 HTTP/1.1 304 Not Modified
Redis 缓存示例
// 缓存策略伪代码 async function getUser(userId) { // 1. 先检查缓存 const cached = await redis.get(`user:${userId}`); if (cached) { return JSON.parse(cached); } // 2. 缓存未命中,查询数据库 const user = await database.findUser(userId); // 3. 将结果缓存 await redis.setex(`user:${userId}`, 3600, JSON.stringify(user)); return user; }
微服务架构中的 API
服务间通信
API 网关模式
// API 网关路由配置 { "routes": [ { "path": "/api/users/*", "service": "user-service", "url": "http://user-service:3001" }, { "path": "/api/orders/*", "service": "order-service", "url": "http://order-service:3002" } ] }
GraphQL vs REST
REST API 的局限性
// REST: 需要多次请求获取相关数据 GET /api/users/123 // 获取用户信息 GET /api/users/123/posts // 获取用户发布的文章 GET /api/posts/456/comments // 获取文章评论
GraphQL 的优势
// GraphQL: 一次请求获取所需数据 query { user(id: 123) { name email posts { title comments { content author } } } }
点我分享笔记