安全管理子系统(app)-9

今天在做app删除时遇见了一个问题:
@HTTP(method = "DELETE", path = "safetyrisk/{id}", hasBody = true)
Call deleteSafetyRisk(@Path("id") int id, @Body safetyrisk requestBody);

使用这个无法完成删除功能,原因:
DELETE 方法的特性:
根据 HTTP 规范,DELETE 方法理论上可以包含请求体,但部分服务器或工具(如 Retrofit 默认配置)可能对其限制较严格,认为 DELETE 通常通过 URL 路径或查询参数传递参数,而非请求体。
Retrofit 的默认校验:
Retrofit 会校验注解是否匹配参数类型。若 @Body 出现在不支持请求体的方法中(如早期版本对 DELETE 的默认处理),会抛出 Non-body HTTP method cannot contain @Body 错误。

修改后使用 @HTTP 注解替代 @DELETE
@HTTP(method = "DELETE", path = "safetyrisk/{id}", hasBody = true) // 直接声明 HTTP 方法和请求体
Call deleteSafetyRisk(@Path("id") int id, @Body safetyrisk requestBody);

总结:核心规则与最佳实践
HTTP 方法与请求体的兼容性:
POST、PUT、PATCH 等方法天然支持请求体,可直接使用 @Body。
GET、DELETE 等方法默认不支持请求体,若需使用,需显式声明 hasBody = true(如 @DELETE(hasBody = true) 或 @HTTP(hasBody = true))。
注解的唯一性:
避免重复声明 HTTP 方法(如同时使用 @DELETE 和 @HTTP(method = "DELETE"))。
前后端参数匹配:
后端通过 @RequestBody 接收参数时,前端必须通过 @Body 传递请求体,并确保 HTTP 方法允许携带请求体。

posted @ 2025-06-03 19:15  呓语-MSHK  阅读(30)  评论(0)    收藏  举报