20190730 跨服务调用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenrushui/article/details/97818176

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");
    }

}

 

展开阅读全文

没有更多推荐了,返回首页