一、RestTemplate

1.RestTemplate是啥

我在网上搜了一波,写的都是些什么垃圾玩楞,一个个抄来抄去的,我真尼玛服了,自己没有点脑子的?写个博客动个脑子是会死么?有一些好一点的还标个转载,有些脸都不要了就楞是标着自己是原创,我创你MLGB。这里点名CSDN这个平台,都是些什么垃圾选手在这,不排除有些优质的创作者,但是更多的是一些憨逼,只会抄袭的。

这里说回RestTemplate
其实一开始我也不知道RestTemplate是什么东西,于是我怀着探索的精神点开了它的源码,就发现这上面有一大段的注释,清清楚楚的写着,这个RestTemplate到底是个干什么的。
图片说明
具体是什么意思呢?我谷歌机翻了一下:
Spring的中心类,用于同步客户端HTTP访问。
它简化了与HTTP服务器的通信,并强制执行RESTful原则。
它处理HTTP连接,留下应用程序代码以提供URL(带有可能的模板变量)并提取结果。
这注释写的不够详细么,为啥要去吃他们写出来的屎。

而且第二段注释中写到,你也可以不用RestTemplate,其他的像Apache HttpComponents, Netty, 或者 OkHttp都可以建立HTTP链接。

2.为什么要用RestTemplate

这个问题好!

3.怎么使用RestTemplate

RestTemplate是spring提供用来调用RESTful接口的类,里面提供了大量便捷的方法

delete(java.lang.String, java.lang.Object...)

getForObject(java.lang.String, java.lang.Class, java.lang.Object...)
getForEntity(java.lang.String, java.lang.Class, java.lang.Object...)

headForHeaders(java.lang.String, java.lang.Object...)

optionsForAllow(java.lang.String, java.lang.Object...)

postForLocation(java.lang.String, java.lang.Object, java.lang.Object...)
postForObject(java.lang.String, java.lang.Object, java.lang.Class, java.lang.Object...)

put(java.lang.String, java.lang.Object, java.lang.Object...)

exchange(java.lang.String, org.springframework.http.HttpMethod,org.springframework.http.HttpEntity,
java.lang.Class, java.lang.Object...)

execute(java.lang.String, org.springframework.http.HttpMethod,org.springframework.web.client.RequestCallback,org.springframework.web.client.ResponseExtractor, java.lang.Object...)

1.GET请求

getForEntity

点开源码可以看到

@Override
    public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
            throws RestClientException {

        RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
        return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
    }

该方法返回一个ResponseEntity,这个对象封装了HTTP的重要元素如请求状态码、HttpHeaders等
说了这么多,到底要怎么用呢?

    @RequestMapping("/useRestTemplate")
    public String useRibbonGetInstance() {
        //获取服务列表
        ServiceInstance instance = loadBalancerClient.choose("msb_eureka_provider");

        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/getHi";

        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, "haha");

        String body = responseEntity.getBody();

        return responseStr;
    }

getForObject

该方法可以理解为对getForEntity的进一步封装

@Override
    @Nullable
    public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
        HttpMessageConverterExtractor<T> responseExtractor =
                new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);
        return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
    }

这个方法通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。

@RequestMapping("/useRestTemplate")
    public String useRibbonGetInstance() {
        //获取服务列表
        ServiceInstance instance = loadBalancerClient.choose("msb_eureka_provider");

        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/getHi";

        String responseStr = restTemplate.getForObject(url, String.class);

        return responseStr;
    }

当不需要关注请求响应除body外的其他内容时,可以少一个从Response中获取body的步骤。