SpringCloud如何优雅地处理消息响应

admin 138 0

问题引入

我们写相应代码通常采用统一封装的Pojo类,如我的是这样:

public class Msg {
    @ApiParam(value = "响应码")
    private Integer code;
    @ApiParam(value = "描述")
    private String description;
    @ApiParam(value = "数据")
    private Object data;
}

再通过枚举定义响应码和描述。

但这样不够规范,如401响应等等这些没有用到,不方便其他上层组件做处理。

比如前端的axios拦截响应代码里:

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data

应该后端返回符合HTTP规范的响应码,方便前端做统一处理。

使用ResponseEntity处理返回

一段很简单的代码:

return new ResponseEntity<>("Hello World!", HttpStatus.OK);

这也可以与Feign等上层微服务组件良好对接。

下面是设置响应头:

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Custom-Header", "foo");

    return new ResponseEntity<>(
      "Custom header set", headers, HttpStatus.OK);
}

HTTP响应码的处理

ResponseEntity提供了两个内嵌的构建器接口: HeadersBuilder 和其子接口 BodyBuilder。因此我们能通过ResponseEntity的静态方法直接访问。

BodyBuilder accepted();
BodyBuilder badRequest();
BodyBuilder created(java.net.URI location);
HeadersBuilder<?> noContent();
HeadersBuilder<?> notFound();
BodyBuilder ok();


其他方案

  • ResponseBody注解

  • ResponseStatus注解


总结

  • ResponseEntity的优先级高于@ResponseBody;在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。

如果响应类型是ResponseEntity可以不写@ResponseBody注解,写了也没有关系。


  • ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码),用于RestTemplate以及@Controller的HandlerMethod。

它在Controoler中或者用于服务端响应时,作用是和@ResponseStatus与@ResponseBody结合起来的功能一样的。

用于RestTemplate时,它是接收服务端返回的http status code 和 reason的。 


  • 简单粗暴的讲,@ResponseBody可以直接返回Json结果, @ResponseEntity不仅可以返回json结果,还可以定义返回的HttpHeaders和HttpStatus

标签: http 后端 响应体 springcloud

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~