背景

我们在开发java后端的时候,多多少少会遇到一些需要接受别人数据的时候,那通常这种情况,对面大多数情况下都会使用HTTP的方式来提供接口。按照之前的开发经验,大多数人会采用apache的HttpClient开发,或者使用OKHTTP开发。但这两种方式,都需要很长一段代码(或者我直接复制一个类过来),代码复杂、还要担心资源回收的问题。

RestTemplate是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

RestTemplate使用

引入RestTemplate

RestTemplate是spring的一个rest客户端,在spring-web这个包下,spring boot的依赖如下

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

配置RestTemplate类:

package com.deepbluebi.aip.smartoffice.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.converter.StringHttpMessageConverter;
import java.nio.charset.Charset;
/**
 * 描述:
 *
 * @author xxx
 * @create 2019-07-25-15:55
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate= new RestTemplate(factory);
        // 支持中文编码
        restTemplate.getMessageConverters().set(1,
                new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;

    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }
}

配置类其实没啥好说的,大家自己看就行,重点就是如何使用restTemplate

RestTemplate使用

下面我们讲几种最常用的方法:

- Get请求:

getForObjectgetForEntity 这两个方法都是采用get请求去获取数据。

但是 getForObject()其实比getForEntity()多包含了将HTTP转成POJO的功能,但是getForObject没有处理response的能力。因为它拿到手的就是成型的pojo。省略了很多response的信息。

resttemplate cookie resttemplate cookiestore_spring


我们可以看到 getForEntity提供了三个方法。

第二个很简单,对应的参数:一个是url地址 ,一个是返回的实体类。

第一个方法 第三个参数是对应的url中带的参数。(不是很懂,所以不常用)

第三个方法(常用):url参数是个Map类。

例子:

String  url = "http://www.xxxx.com?userId={userId}&begin={begin}&end={end}";
        Map<String,String> map = new HashMap<>();
        map.put("userId", "1");
        map.put("begin", "1");
        map.put("end", "10");
        restTemplate.getForEntity(url, ResponseBean.class,map);

getForObject 和getForEntity 差不都,不多介绍了。
这里还得注重介绍下getForEntity 返回的ResponseEntity 这个类:

ResponseEntity response = restTemplate.getForEntity(url, ResponseBean.class,map);
		response.getHeaders();		//响应头
		response.getStatusCode();	//响应码
		response.getBody();			//响应体,就是返回内容

- POST请求:

post请求应该是比GET请求还要常用的方法:最常见的就是在post请求中添加 header。

我们先从基本开始看。

POST和GET请求一样也有 postForObjectpostForEntity

post和get的区别就是 post 是把发送的内容放到body里面。那么我们需要先构建body类。也就是

HttpEntity

resttemplate cookie resttemplate cookiestore_HTTP_02


我们可以看到HttpEntity有三个构造方法。其中需要注意的是第三个构造方法,其实也很好理解,MultiValueMap 也就使header。

举个例子:

String url = "http://www.xxxx.com";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("userId", "3212xxxxxxxxxxxxxx");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
        System.out.println(response.getBody());

包括返回数据乱码都可以在 header中指定返回类型

通用的exchange 方法:

exchange()方法跟上面的方法不同之处在于它可以指定请求的HTTP类型。

exchange方法有以下几种:

resttemplate cookie resttemplate cookiestore_restTemplate_03


感觉挺多的,我就不一一介绍了 -。-

举个例子:

String yesterdayDate = DateUtil.getPreDateByDate(new Date());
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-API-KEY", XAPIKEY);
        headers.add("X-API-SECRET ", XAPISECRET);
        HashMap<String, String> map = new HashMap<>();
        map.put("edge_channel", edgcChannel);
        map.put("time_begin", yesterdayDate);
        map.put("time_end", yesterdayDate);
        map.put("page_size", pageSize);
        map.put("page_num", String.valueOf(pageNum));
        HttpEntity httpEntity = new HttpEntity(null, headers);
        ResponseEntity<OpPassRecordBean> result = restTemplate.exchange(passRecordUrl, HttpMethod.GET, httpEntity

总结:

从去年到今年隔了有一年才开始更新博客了,去年那个时候也是正好换工作的时候 ,所以忙着换工作也没时间更新,后来找到工作了,刚上班也比较忙,没啥时间来更新(其实就是懒=。=)。最近恢复更新,嘻嘻。