Spring提供多种方式处理http请求。
1、ResponseEntity标识整个http请求响应:状态码、头部信息以及相应体内容。
2、如果需要使用ResponseEntity,必须在请求点返回,通常在spring rest中实现。ResponseEntity是通用类型,因此可以使用任意类型作为响应体。
3、ResponseEntity提供了两个内嵌的构建器接口: HeadersBuilder 和其子接口 BodyBuilder。因此我们能通过ResponseEntity的静态方法直接访问。
4、尽管ResponseEntity非常强大,但不应该过度使用。在一些简单情况下,还有其他方法能满足我们的需求,使代码更整洁。替代方法:
@ResponseBody
典型spring mvc应用,请求点通常返回html页面。有时我们仅需要实际数据,如使用ajax请求。这时我们能通过@ResponseBody注解标记请求处理方法,审批人能够处理方法结果值作为http响应体。
@ResponseStatus
当请求点成功返回,spring提供http 200(ok)相应。如果请求点抛出异常,spring查找异常处理器,由其返回相应的http状态码。对这些方法增加@ResponseStatus注解,spring会返回自定义http状态码。
HttpStatus 内部定义的错误码
服务器500错误:500错误的出现原因是很多的,但是你要知道,500错误是服务器内部错误
服务器502错误:错误的网关。
服务器504错误:这是代表着网关超时现象出现了。 Gateway time-out,今天老曹发给我了,突然就蒙了,没想到504是什么意思?
直接操作相应
Spring 也允许我们直接 javax.servlet.http.HttpServletResponse 对象;只需要申明HttpServletResponse 作为方法参数:但需要说明,既然spring已经提供底层实现的抽象和附件功能,我们不建议直接操作response。
/**
* 跨服务调用
*/
public class RestUtils {
@Autowired
private RestTemplate restTemplate;
public ResponseEntity<BaseResult<List<Doctor>>> getRemoteData(String url) {
//请求头
HttpHeaders headers = new HttpHeaders();
headers.add("version", "version");
headers.add("token", "token");
//请求实体
HttpEntity<String> httpEntity = new HttpEntity<>(null, headers);
process(httpEntity);
//返回数据模型的泛型类型
ParameterizedTypeReference<BaseResult<List<Doctor>>> classType = new ParameterizedTypeReference<BaseResult<List<Doctor>>>() {
};
ResponseEntity<BaseResult<List<Doctor>>> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, classType, new HashMap<>());
//不能传递请求头,具备局限性
//Object forObject = restTemplate.getForObject();
return responseEntity;
}
@GetMapping("/")
public void getHttpData(HttpServletResponse response) throws IOException {
response.setHeader("token", "token");
response.setStatus(200);
response.getWriter().write("success");
}
private void process(HttpEntity<String> httpEntity) {
System.out.println(httpEntity.getBody());
System.out.println(httpEntity.getHeaders());
//HttpStatus:请求状态
//ResponseEntity:请求响应
ResponseEntity<String> responseEntity = new ResponseEntity<>("success", HttpStatus.OK);
//为ResponseEntity设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add("token", "token");
new ResponseEntity<>("success", headers, HttpStatus.OK);
//构建者模式
//ResponseEntity作为响应对象
ResponseEntity.ok("Hello World!");
ResponseEntity.ok().header("token", "token").body("success");
}
}