Springboot中RestTemplate的使用和理解
一. RestTemplate是什么?
在java代码里访问restful服务,一般使用Apache的HttpClient,编写比较复杂。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate(类似JdbcTemplate)
二.springboot中如何使用
2.1配置:
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;
/**
* RestTemplate配置类
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//单位为ms
factory.setConnectTimeout(5000);//单位为ms
return factory;
}
}
2.2使用
@Test
public void testRest(){
String url = "https://localhost:8080/user/1";
Map<String,Object> paraMap = new HashMap();
User u = restTemplate.getForObject(url, User.class, paraMap);
System.out.println(u);
}
用postForObject
的方法,(url, requestMap, ResponseBean.class
)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。
三.深入理解
调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。ClientHttpRequestFactory接口主要提供了两种实现方式
一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。
一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。
restTemplate的getForObject方法的本质其实就是HttpURLConnection进行资源的调用,在此期间它会帮我们进行uri的校验,参数封装,头信息放置,其次会创建request,response,然后封装请求头,响应头信息,最终将获得的输入流通过工具类转换为我们参数指定的返回类型的值。
附restTemplate原理仿写
@Test
public void testURLConnection() throws IOException {
getMethod("http://localhost:8080/user/1",null);
}
public void getMethod(String url, String query) throws IOException {
URL restURL = new URL(url);
// 获得一个URLConnection
HttpURLConnection conn = (HttpURLConnection) restURL.openConnection();
// 设置为 GET请求
conn.setRequestMethod("GET");
// 设置请求属性
conn.setRequestProperty("Content-Type", "text/plain");
// 表示输出
conn.setDoOutput(true);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
上一篇: laravel 队列的简单理解和使用
下一篇: Python:函数的返回值总结