最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 后端HTTP 請求(GET/POST)傳輸規(guī)范

 更新時間:2026年04月18日 11:08:37   作者:凱qwq  
文章詳細闡述了RESTful API設計的最佳實踐,涵蓋了GET和POST請求的規(guī)范、參數(shù)傳遞、響應體、版本控制、日志記錄等,本文介紹實例代碼介紹了Java后端HTTP請求(GET/POST)傳輸規(guī)范,感興趣的朋友一起看看吧

一、核心原則

  1. 遵循 “RESTful 風格”,URI 僅表示資源,HTTP 方法表示操作;
  2. GET 僅用于查詢,禁止通過 GET 傳遞敏感數(shù)據(jù);POST 用于新增 / 修改 / 刪除,或傳遞大量 / 敏感數(shù)據(jù);
  3. 所有接口參數(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: true

4. 敏感數(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ī)范

  1. 請求頭規(guī)范
    • 跨域請求:后端配置CorsConfig,允許前端的 Origin、Method、Header;
    • 認證請求:token 統(tǒng)一放在Authorization請求頭,后端用@RequestHeader("Authorization") String token接收。
  2. 日志規(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);
}
  1. 性能規(guī)范
    • GET 請求建議添加緩存(如 Redis),避免頻繁查庫;
    • POST 請求建議異步處理(如 MQ),耗時操作(如文件解析、數(shù)據(jù)同步)不阻塞接口響應。

總結(jié)

  1. 編碼核心:GET 用@PathVariable/@RequestParam,POST 用@RequestBody,參數(shù)校驗用 JSR380+@Valid
  2. 響應核心:所有接口統(tǒng)一返回ResultDTO,異常統(tǒng)一由GlobalExceptionHandler捕獲;
  3. 安全核心:GET 禁止傳敏感數(shù)據(jù),POST 新增接口保證冪等,日志屏蔽敏感信息;
  4. 規(guī)范核心:URI 用小寫復數(shù)名詞 + 版本號,參數(shù)命名小駝峰,編碼統(tǒng)一 UTF-8。
請求類型參數(shù)傳遞位置前端核心寫法(示例)后端核心寫法(Java)適用場景關(guān)鍵規(guī)范 / 注意事項
GETURL 路徑參數(shù)axios.get('/api/v1/users/1001')@GetMapping("/{userId}")@PathVariable("userId") Long userId查詢單個資源(如查用戶 / 訂單)1. 路徑參數(shù)為唯一標識(ID / 編號)2. URI 用復數(shù)名詞,小寫
GETURL 查詢參數(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接收
POSTRequest 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
POSTForm 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 傳遞
POSTMultipart 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 僅表示資源
文件上傳用 JSONaxios.post('/upload', { file: fileObj })@RequestBody接收文件JSON 無法傳輸二進制文件

總結(jié)

  1. 核心匹配:路徑參數(shù)→@PathVariable、查詢參數(shù)→@RequestParam、JSON→@RequestBody、文件→@RequestPart
  2. 場景優(yōu)先:查詢用 GET(路徑 / 查詢參數(shù)),新增 / 修改 / 文件用 POST(JSON/FormData);
  3. 規(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot整合prometheus實現(xiàn)資源監(jiā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判斷各類型字符個數(shù)實例代碼

    java判斷各類型字符個數(shù)實例代碼

    大家好,本篇文章主要講的是java判斷各類型字符個數(shù)實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 基于Java實現(xiàn)Json文件轉(zhuǎn)換為Excel文件

    基于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)及多線程應用案例

    這篇文章主要為大家介紹了java?list和map切割分段的實現(xiàn)及多線程應用案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Springboot @Transactional大事務處理的幾點建議

    Springboot @Transactional大事務處理的幾點建議

    本文主要介紹了大事務的概念及其危害,并提出了幾種解決大事務問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Mybatis 如何在配置文件中給實體類起別名

    Mybatis 如何在配置文件中給實體類起別名

    這篇文章主要介紹了Mybatis 如何在配置文件中給實體類起別名的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java并發(fā)線程間的通信最佳實踐

    Java并發(fā)線程間的通信最佳實踐

    這篇文章主要介紹了Java并發(fā)線程間的通信最佳實踐,本文將帶你全面了解線程間通信的原理、常見陷阱以及如何優(yōu)雅地實現(xiàn)線程協(xié)作,需要的朋友可以參考下
    2026-03-03
  • 淺談Java中的克隆close()和賦值引用的區(qū)別

    淺談Java中的克隆close()和賦值引用的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java中的克隆close()和賦值引用的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java與MySQL導致的時間不一致問題分析

    Java與MySQL導致的時間不一致問題分析

    在使用MySQL的過程中,你可能會遇到時區(qū)相關(guān)問題,本文主要介紹了Java與MySQL導致的時間不一致問題分析,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Python 字典常用操作之鍵值對的高效數(shù)據(jù)管理

    Python 字典常用操作之鍵值對的高效數(shù)據(jù)管理

    在 Python 的內(nèi)置數(shù)據(jù)結(jié)構(gòu)中,字典(dict)以其靈活、高效和直觀的特性,成為開發(fā)者最常用的工具之一,本文將帶你從零開始,系統(tǒng)掌握 Python字典的基礎知識與常用操作,感興趣的朋友跟隨小編一起看看吧
    2026-02-02

最新評論

淮阳县| 塔城市| 石城县| 如东县| 铜梁县| 外汇| 新巴尔虎右旗| 宜丰县| 岑溪市| 文登市| 庆元县| 满城县| 西乌| 得荣县| 漳浦县| 平陆县| 五指山市| 新平| 彭水| 泰顺县| 锦屏县| 杂多县| 二连浩特市| 札达县| 陆川县| 高州市| 南丰县| 镶黄旗| 榆林市| 甘洛县| 郸城县| 革吉县| 明星| 大渡口区| 泸溪县| 绥滨县| 大同市| 微博| 漯河市| 滨州市| 洛川县|