get请求和post请求
| 特性 | GET | POST |
|---|---|---|
| 参数位置 | URL 查询参数 | 请求体(Body) |
| 数据复杂度 | 仅支持简单键值对 | 支持嵌套对象、数组等复杂结构 |
| 安全性 | 参数暴露在 URL 和浏览器历史记录 | 参数隐藏,适合敏感数据 |
| 缓存 | 可被浏览器缓存 | 默认不缓存 |
Get请求示例:
点击查看代码
@GetMapping("/by-category")
public ResponseEntity<Page<Policy>> getPoliciesByCategories(
@RequestParam("categoryIds") List<String> categoryIds,
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "timeRange", required = false) String timeRange,
@RequestParam(value = "policyRange", required = false) String policyRange,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return ResponseEntity.ok(
policyService.getPoliciesByCategories(
categoryIds,
keyword,
timeRange,
policyRange,
PageRequest.of(page, size)
)
);
}
改为Post请求示例:
点击查看代码
@PostMapping("/by-category")
public ResponseEntity<Page<Policy>> getPoliciesByCategories(
@RequestBody CategorySearchRequest request) {
return ResponseEntity.ok(
policyService.getPoliciesByCategories(
request.getCategoryIds(),
request.getKeyword(),
request.getTimeRange(),
request.getPolicyRange(),
PageRequest.of(request.getPage(), request.getSize())
)
);
}
// 1. 创建DTO接收请求参数
@Data
public class CategorySearchRequest {
private List<String> categoryIds;
private String keyword;
private String timeRange;
private String policyRange;
private int page = 0;
private int size = 10;
}
实际应用建议
优先使用 GET:
适合简单、幂等的查询(如关键词搜索、分页)。
利用浏览器缓存提升性能。
使用 POST 的场景:
参数复杂(如多级筛选、范围查询)。
需要隐藏敏感数据(如 API 密钥)。
查询条件超过 URL 长度限制。
RESTful 设计:
遵循 GET 用于查询、POST 用于创建资源的语义化原则。
对复杂查询,可设计专用端点如 /api/advanced-search,使用 POST 传递参数。
浙公网安备 33010602011771号