Java 后端HTTP 請求(GET/POST)傳輸規(guī)范
更新時間:2026年04月18日 11:08:37 作者:凱qwq
文章詳細闡述了RESTful API設計的最佳實踐,涵蓋了GET和POST請求的規(guī)范、參數(shù)傳遞、響應體、版本控制、日志記錄等,本文介紹實例代碼介紹了Java后端HTTP請求(GET/POST)傳輸規(guī)范,感興趣的朋友一起看看吧
一、核心原則
- 遵循 “RESTful 風格”,URI 僅表示資源,HTTP 方法表示操作;
- GET 僅用于查詢,禁止通過 GET 傳遞敏感數(shù)據(jù);POST 用于新增 / 修改 / 刪除,或傳遞大量 / 敏感數(shù)據(jù);
- 所有接口參數(shù)、響應數(shù)據(jù)統(tǒng)一使用 UTF-8 編碼,避免亂碼。
二、GET 請求規(guī)范
1. 用途限制
- 僅用于查詢 / 獲取資源,禁止用于新增、修改、刪除操作;
- 后端注解:統(tǒng)一使用
@GetMapping,禁止用@RequestMapping(method = RequestMethod.GET)(冗余)。
2. 參數(shù)傳遞規(guī)則(Java 編碼落地)
(1)路徑參數(shù)(唯一標識)
- 后端用
@PathVariable接收,參數(shù)名與 URI 中的占位符一致; - ? 正確代碼示例:
// URI:GET /api/v1/users/1001
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@GetMapping("/{userId}")
public ResultDTO<UserInfoRespDTO> getUserById(@PathVariable("userId") Long userId) {
UserInfoRespDTO user = userService.getUserById(userId);
return ResultDTO.success(user);
}
}- ? 錯誤:用
@RequestParam接收唯一標識(如@RequestParam("userId") Long userId)。
(2)查詢參數(shù)(篩選 / 分頁 / 排序)
- 后端用
@RequestParam接收,可設置默認值、是否必傳; - 參數(shù)命名:小駝峰,與前端一致,禁止用下劃線;
- ? 正確代碼示例:
// URI:GET /api/v1/orders?status=PAID&pageNum=1&pageSize=10
@GetMapping("/orders")
public ResultDTO<PageInfo<OrderListRespDTO>> getOrderList(
@RequestParam(value = "status", required = false) String status,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize
) {
PageInfo<OrderListRespDTO> page = orderService.getOrderList(status, pageNum, pageSize);
return ResultDTO.success(page);
}(3)復雜查詢參數(shù)(多個篩選條件)
- 封裝為
XXXQueryReqDTO,用@ModelAttribute接收(避免參數(shù)過多); - ? 正確代碼示例:
// 封裝查詢DTO
@Data
public class OrderQueryReqDTO {
private String status;
private String orderNo;
private LocalDateTime startTime;
private LocalDateTime endTime;
private Integer pageNum = 1;
private Integer pageSize = 10;
}
// 接口接收
@GetMapping("/orders/query")
public ResultDTO<PageInfo<OrderListRespDTO>> queryOrder(@ModelAttribute OrderQueryReqDTO queryDTO) {
PageInfo<OrderListRespDTO> page = orderService.queryOrder(queryDTO);
return ResultDTO.success(page);
}3. 長度與編碼
- 后端無需手動 URL 解碼(SpringMVC 自動解碼);
- 若參數(shù)含中文 / 特殊字符,確保
application.yml中配置:
server:
tomcat:
uri-encoding: UTF-8
spring:
http:
encoding:
charset: UTF-8
enabled: true
force: true4. 敏感數(shù)據(jù)禁止
- 后端通過攔截器 / 切面校驗:若 GET 請求參數(shù)包含
password/token/phone等敏感字段,直接返回 400; - 示例(攔截器邏輯):
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String method = request.getMethod();
if ("GET".equals(method)) {
Map<String, String[]> paramMap = request.getParameterMap();
if (paramMap.containsKey("password") || paramMap.containsKey("token")) {
response.setStatus(400);
response.getWriter().write(JSON.toJSONString(ResultDTO.fail("GET請求禁止傳遞敏感數(shù)據(jù)")));
return false;
}
}
return true;
}三、POST 請求規(guī)范
1. 用途限制
- 用于新增 / 修改 / 刪除資源,或傳遞大量 / 敏感數(shù)據(jù)的查詢;
- 后端注解:統(tǒng)一使用
@PostMapping,禁止用@RequestMapping(method = RequestMethod.POST)。
2. 參數(shù)傳遞規(guī)則(Java 編碼落地)
(1)JSON 參數(shù)(主流)
- 后端用
@RequestBody接收,參數(shù)封裝為XXXReqDTO,并添加 JSR380 參數(shù)校驗注解; - ? 正確代碼示例:
// 新增用戶DTO(含參數(shù)校驗)
@Data
@Schema(description = "用戶新增請求參數(shù)")
public class UserAddReqDTO {
@NotBlank(message = "用戶名不能為空")
@Size(min = 2, max = 20, message = "用戶名長度需在2-20位")
private String username;
@NotBlank(message = "密碼不能為空")
@Pattern(regexp = "^[a-zA-Z0-9@#$%^&*]{6,32}$", message = "密碼僅支持字母、數(shù)字、特殊符號,長度6-32位")
private String password;
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機號格式錯誤")
private String phoneNumber;
}
// 接口接收
@PostMapping("/users")
public ResultDTO<Long> addUser(@Valid @RequestBody UserAddReqDTO addDTO) {
Long userId = userService.addUser(addDTO);
return ResultDTO.success(userId, "新增用戶成功");
}- 注意:必須加
@Valid觸發(fā)參數(shù)校驗,否則注解不生效;校驗失敗會拋出MethodArgumentNotValidException,需在全局異常處理器中捕獲。
(2)文件上傳(multipart/form-data)
- 后端用
@RequestPart接收文件,@RequestParam接收附加參數(shù); - 配置文件上傳大小限制:
spring:
servlet:
multipart:
max-file-size: 10MB # 單個文件大小
max-request-size: 50MB # 總文件大小- ? 正確代碼示例:
@PostMapping("/files/upload")
public ResultDTO<FileUploadRespDTO> uploadFile(
@RequestPart("file") MultipartFile file,
@RequestParam("fileName") String fileName
) {
// 校驗文件類型/大小
if (!file.getContentType().startsWith("image/")) {
return ResultDTO.fail(400, "僅支持圖片上傳");
}
FileUploadRespDTO resp = fileService.upload(file, fileName);
return ResultDTO.success(resp);
}(3)冪等性保障(新增接口)
- 后端通過 “唯一業(yè)務編號”+ 數(shù)據(jù)庫唯一索引實現(xiàn)冪等;
- 示例:新增訂單時,前端傳遞
orderNo(UUID),后端先查后插:
@Transactional(rollbackFor = Exception.class)
public Long addOrder(OrderCreateReqDTO createDTO) {
// 1. 校驗訂單號是否已存在(冪等核心)
if (orderMapper.existsByOrderNo(createDTO.getOrderNo())) {
throw new BusinessException("訂單已存在,請勿重復提交");
}
// 2. 新增訂單
Order order = new Order();
BeanUtils.copyProperties(createDTO, order);
orderMapper.insert(order);
return order.getId();
}3. 特殊場景:POST 查詢(敏感 / 大量參數(shù))
- 適用于參數(shù)過多(超過 URL 長度限制)、含敏感數(shù)據(jù)的查詢;
- ? 正確代碼示例:
// 復雜訂單查詢(參數(shù)多、含敏感條件)
@PostMapping("/orders/complex-query")
public ResultDTO<PageInfo<OrderListRespDTO>> complexQuery(@RequestBody OrderComplexQueryReqDTO queryDTO) {
PageInfo<OrderListRespDTO> page = orderService.complexQuery(queryDTO);
return ResultDTO.success(page);
}四、通用規(guī)范(GET/POST 均適用)
1. URI 命名規(guī)則(Java 編碼落地)
- Controller 類上的
@RequestMapping統(tǒng)一以/api/v{版本號}/開頭,資源用復數(shù)名詞; - ? 正確:
@RequestMapping("/api/v1/users"),? 錯誤:@RequestMapping("/api/v1/user")/@RequestMapping("/api/v1/getUser")。
2. 響應規(guī)范(統(tǒng)一返回體)
- 后端封裝通用響應類
ResultDTO,所有接口統(tǒng)一返回該類型,禁止直接返回業(yè)務對象 / 字符串; - ? 通用響應類代碼:
@Data
public class ResultDTO<T> {
// 狀態(tài)碼:200成功,400參數(shù)錯誤,403權(quán)限不足,500服務異常
private Integer code;
// 提示信息
private String msg;
// 業(yè)務數(shù)據(jù)
private T data;
// 成功響應(帶數(shù)據(jù))
public static <T> ResultDTO<T> success(T data) {
ResultDTO<T> result = new ResultDTO<>();
result.setCode(200);
result.setMsg("操作成功");
result.setData(data);
return result;
}
// 成功響應(無數(shù)據(jù))
public static ResultDTO<Void> success() {
return success(null);
}
// 失敗響應
public static ResultDTO<Void> fail(Integer code, String msg) {
ResultDTO<Void> result = new ResultDTO<>();
result.setCode(code);
result.setMsg(msg);
return result;
}
}3. 異常處理(Java 編碼落地)
- 全局異常處理器統(tǒng)一捕獲所有異常,返回標準化
ResultDTO,禁止接口拋出未捕獲異常; - ? 全局異常處理器代碼:
@RestControllerAdvice
public class GlobalExceptionHandler {
// 捕獲參數(shù)校驗異常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultDTO<Void> handleValidException(MethodArgumentNotValidException e) {
String msg = e.getBindingResult().getFieldError().getDefaultMessage();
return ResultDTO.fail(400, msg);
}
// 捕獲自定義業(yè)務異常
@ExceptionHandler(BusinessException.class)
public ResultDTO<Void> handleBusinessException(BusinessException e) {
return ResultDTO.fail(e.getCode(), e.getMessage());
}
// 捕獲所有未處理的異常
@ExceptionHandler(Exception.class)
public ResultDTO<Void> handleException(Exception e) {
// 記錄詳細異常日志
log.error("服務端異常", e);
return ResultDTO.fail(500, "服務器內(nèi)部錯誤,請稍后重試");
}
}4. 接口版本控制
- 后端通過 URI 攜帶版本號(推薦),禁止通過參數(shù)(如
?version=1)或請求頭控制版本; - ? 正確:
@RequestMapping("/api/v1/users"),@RequestMapping("/api/v2/users")。
五、反例與正例對照表(Java 編碼)
表格
| 場景 | 反例(禁止) | 正例(推薦) |
|---|---|---|
| GET 查詢單個用戶 | @GetMapping("/getUser") + @RequestParam("userId") Long userId | @GetMapping("/{userId}") + @PathVariable Long userId |
| POST 新增用戶 | @PostMapping("/addUser") + URL 傳參 | @PostMapping("/users") + @RequestBody UserAddReqDTO |
| 響應數(shù)據(jù) | return user;(直接返回業(yè)務對象) | return ResultDTO.success(user); |
| 參數(shù)校驗 | 手動 if 判斷(if (username == null) { throw new Exception(); }) | JSR380 注解(@NotBlank)+ @Valid |
六、Java 后端編碼額外規(guī)范
- 請求頭規(guī)范:
- 跨域請求:后端配置
CorsConfig,允許前端的 Origin、Method、Header; - 認證請求:token 統(tǒng)一放在
Authorization請求頭,后端用@RequestHeader("Authorization") String token接收。
- 跨域請求:后端配置
- 日志規(guī)范:
- 所有接口入?yún)?/ 出參必須打印日志(使用 SLF4J),禁止打印敏感數(shù)據(jù)(如密碼);
- ? 示例:
@GetMapping("/{userId}")
public ResultDTO<UserInfoRespDTO> getUserById(@PathVariable("userId") Long userId) {
log.info("【查詢用戶】入?yún)ⅲ簎serId={}", userId);
UserInfoRespDTO user = userService.getUserById(userId);
log.info("【查詢用戶】出參:{}", JSON.toJSONString(user));
return ResultDTO.success(user);
}- 性能規(guī)范:
- GET 請求建議添加緩存(如 Redis),避免頻繁查庫;
- POST 請求建議異步處理(如 MQ),耗時操作(如文件解析、數(shù)據(jù)同步)不阻塞接口響應。
總結(jié)
- 編碼核心:GET 用
@PathVariable/@RequestParam,POST 用@RequestBody,參數(shù)校驗用 JSR380+@Valid; - 響應核心:所有接口統(tǒng)一返回
ResultDTO,異常統(tǒng)一由GlobalExceptionHandler捕獲; - 安全核心:GET 禁止傳敏感數(shù)據(jù),POST 新增接口保證冪等,日志屏蔽敏感信息;
- 規(guī)范核心:URI 用小寫復數(shù)名詞 + 版本號,參數(shù)命名小駝峰,編碼統(tǒng)一 UTF-8。
| 請求類型 | 參數(shù)傳遞位置 | 前端核心寫法(示例) | 后端核心寫法(Java) | 適用場景 | 關(guān)鍵規(guī)范 / 注意事項 |
|---|---|---|---|---|---|
| GET | URL 路徑參數(shù) | axios.get('/api/v1/users/1001') | @GetMapping("/{userId}")@PathVariable("userId") Long userId | 查詢單個資源(如查用戶 / 訂單) | 1. 路徑參數(shù)為唯一標識(ID / 編號)2. URI 用復數(shù)名詞,小寫 |
| GET | URL 查詢參數(shù) | axios.get('/api/v1/orders', { params: { status: 'PAID', pageNum: 1 } }) | @GetMapping("/orders")@RequestParam String status@RequestParam Integer pageNum | 列表篩選 / 分頁 / 排序 | 1. 參數(shù)名小駝峰2. 非必傳參數(shù)加required = false3. 可封裝為 DTO 用@ModelAttribute接收 |
| POST | Request Body(JSON) | axios.post('/api/v1/users', { username: '張三', password: '123456' }) | @PostMapping("/users")@Valid @RequestBody UserAddReqDTO addDTO | 新增 / 修改資源、復雜查詢 | 1. 必加@Valid觸發(fā)參數(shù)校驗2. DTO 加 JSR380 注解(@NotBlank/@Pattern)3. Content-Type: application/json |
| POST | Form Data(表單) | let formData = new FormData();formData.append('username', '張三');axios.post('/api/v1/users/login', formData) | @PostMapping("/login")@RequestParam String username@RequestParam String password | 簡單表單提交(如登錄) | 1. Content-Type: application/x-www-form-urlencoded2. 敏感數(shù)據(jù)建議轉(zhuǎn) JSON 傳遞 |
| POST | Multipart Form Data(文件 + 參數(shù)) | let formData = new FormData();formData.append('file', file);formData.append('fileName', '頭像.png');axios.post('/api/v1/files/upload', formData) | @PostMapping("/upload")@RequestPart("file") MultipartFile file@RequestParam("fileName") String fileName | 文件上傳(單 / 多文件) | 1. 配置文件大小限制(spring.servlet.multipart)2. 文件參數(shù)名統(tǒng)一為file |
| GET/POST | 請求頭參數(shù) | axios.get('/api/v1/users', { headers: { Authorization: 'Bearer token123' } }) | @RequestHeader("Authorization") String token | 傳遞 token / 語言 / 版本等 | 1. 認證 token 統(tǒng)一放Authorization頭2. 非敏感、固定參數(shù)用請求頭 |
| POST | 混合參數(shù)(路徑 + JSON) | axios.post('/api/v1/users/1001/update', { phone: '13800138000' }) | @PostMapping("/{userId}/update")@PathVariable Long userId@RequestBody UserUpdateReqDTO updateDTO | 修改單個資源(帶 ID + 參數(shù)) | 1. 路徑傳唯一標識,Body 傳修改參數(shù)2. 禁止路徑傳大量參數(shù) |
補充:說明(前后端協(xié)作關(guān)鍵)
1. 通用數(shù)據(jù)格式
- 字符編碼:前后端統(tǒng)一用 UTF-8;
- 日期格式:統(tǒng)一用
yyyy-MM-dd HH:mm:ss(前端傳字符串,后端用@DateTimeFormat接收):
// 后端接收日期示例
@GetMapping("/orders")
public ResultDTO<?> getOrders(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime) {
// 業(yè)務邏輯
}- 數(shù)值類型:前端傳遞數(shù)字(如
pageNum: 1),禁止傳字符串(如pageNum: "1"),后端用Integer/Long接收。
2. 錯誤碼 / 響應格式統(tǒng)一
表格
| 響應場景 | 前端接收格式 | 后端返回寫法 |
|---|---|---|
| 成功 | { code: 200, msg: "成功", data: {} } | ResultDTO.success(data) |
| 參數(shù)校驗失敗 | { code: 400, msg: "用戶名不能為空" } | ResultDTO.fail(400, "用戶名不能為空") |
| 權(quán)限不足 | { code: 403, msg: "無權(quán)限" } | ResultDTO.fail(403, "無權(quán)限") |
| 服務端異常 | { code: 500, msg: "服務器錯誤" } | ResultDTO.fail(500, "服務器錯誤") |
3. 反例對照(禁止寫法)
表格
| 場景 | 前端反例 | 后端反例 | 問題說明 |
|---|---|---|---|
| GET 傳敏感數(shù)據(jù) | axios.get('/login?pwd=123456') | @RequestParam String pwd | 密碼暴露在 URL / 日志中 |
| POST 用 URL 傳大量參數(shù) | axios.post('/users?name=張三&age=20&phone=138...') | @RequestParam接收 10 + 個參數(shù) | URL 長度有限制,可讀性差 |
| 路徑參數(shù)用動詞 | axios.get('/api/v1/getUser/1001') | @GetMapping("/getUser/{userId}") | 違反 RESTful 規(guī)范,URI 僅表示資源 |
| 文件上傳用 JSON | axios.post('/upload', { file: fileObj }) | 用@RequestBody接收文件 | JSON 無法傳輸二進制文件 |
總結(jié)
- 核心匹配:路徑參數(shù)→
@PathVariable、查詢參數(shù)→@RequestParam、JSON→@RequestBody、文件→@RequestPart; - 場景優(yōu)先:查詢用 GET(路徑 / 查詢參數(shù)),新增 / 修改 / 文件用 POST(JSON/FormData);
- 規(guī)范統(tǒng)一:參數(shù)名小駝峰、日期格式統(tǒng)一、響應體結(jié)構(gòu)一致,前后端按表對齊即可避免 90% 的參數(shù)傳遞問題。
到此這篇關(guān)于Java 后端HTTP 請求(GET/POST)傳輸規(guī)范的文章就介紹到這了,更多相關(guān)java http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- Java中g(shù)et/post的https請求忽略ssl證書認證淺析
- java發(fā)起http請求調(diào)用post與get接口的方法實例
- java中httpclient封裝post請求和get的請求實例
- Java 使用 HttpClient 發(fā)送 GET請求和 POST請求
- Java如何發(fā)起http請求的實現(xiàn)(GET/POST)
- Java發(fā)送http請求的示例(get與post方法請求)
- Java 發(fā)送http請求(get、post)的示例
- JAVA發(fā)送http get/post請求,調(diào)用http接口、方法詳解
- java模擬http的Get/Post請求,并設置ip與port代理的方法
相關(guān)文章
springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細步驟
Spring Boot與Prometheus的整合可以實現(xiàn)對Spring Boot應用的實時監(jiān)控,有助于更好地維護應用的性能,本文給大家介紹springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細步驟,感興趣的朋友跟隨小編一起看看吧2024-11-11
基于Java實現(xiàn)Json文件轉(zhuǎn)換為Excel文件
這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)Json文件轉(zhuǎn)換為Excel文件,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下2022-12-12
java?list和map切割分段的實現(xiàn)及多線程應用案例
這篇文章主要為大家介紹了java?list和map切割分段的實現(xiàn)及多線程應用案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Springboot @Transactional大事務處理的幾點建議
本文主要介紹了大事務的概念及其危害,并提出了幾種解決大事務問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01
Python 字典常用操作之鍵值對的高效數(shù)據(jù)管理
在 Python 的內(nèi)置數(shù)據(jù)結(jié)構(gòu)中,字典(dict)以其靈活、高效和直觀的特性,成為開發(fā)者最常用的工具之一,本文將帶你從零開始,系統(tǒng)掌握 Python字典的基礎知識與常用操作,感興趣的朋友跟隨小編一起看看吧2026-02-02

