Spring REST中无需入参创建服务端对象应选用GET还是POST
结论:该场景必须使用POST方法
为什么不能用当前的GET实现
- GET方法在HTTP规范中被定义为安全、幂等、只读的操作,要求调用后不会修改服务端状态,且重复调用不会产生额外副作用。你的接口每次调用都会生成新的对象并触发状态变更(从
service.initialize逻辑可判断存在持久化操作),完全不符合GET的语义。 - 实际运行中,浏览器、反向代理、CDN等中间件会默认对GET请求做缓存,如果用GET实现该接口,很可能出现多次调用反而没有生成新对象、直接返回缓存结果的问题,和预期逻辑完全相悖。
关于POST的误解纠正
你印象里POST必须带请求参数/请求体是错误认知:POST的核心语义是「向服务端提交请求以执行对应操作」,没有任何规范要求POST必须携带请求体,空请求体的POST请求是完全合规的。
推荐代码改造方案
仅需要把注解换成@PostMapping即可,也可以按需优化为更符合REST规范的201状态码返回:
@PostMapping("/") public ResponseEntity<InitializeResponse> createNewInitializedObject() { X x = new X(); x = service.initialize(x.getId()); // 基础改造方案,直接返回200 return ResponseEntity.ok().body(new InitializeResponse(x)); // 可选优化:返回201 Created状态码,同时在Location头返回新对象的查询地址 // return ResponseEntity.created(URI.create("/" + x.getId())).body(new InitializeResponse(x)); }
内容的提问来源于stack exchange,提问作者Burak
相关产品推荐
相关产品推荐

