调用远程服务时就必须使用HTTP客户端,主要有四种:JDK原生的URLConnection、Apache的HttpClient、Netty的异步HTTPClient,Spring的RestTemplate。
解放了原先HttpClient的复杂提交,java中调用RESTful服务很典型的是使用HttpClient,对于常用的REST操作,这些方法属于低等级的操作。使用HttpClient我们需要自己封装Post请求,再根据响应的状态码判断从响应中获取header和body,有时候还需要自己做json转换。
Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
在Spring应用程序中访问第三方REST服务与使用SpringRestTemplate类有关。RestTemplate类的设计原则与许多其他Spring*模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如ApacheHttpComponents、Netty或OkHttp等其它HTTPlibrary。
考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。
最新api地址:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
RestTemplate包含以下几个部分:
HttpMessageConverter对象转换器 ClientHttpRequestFactory默认是JDK的HttpURLConnection ResponseErrorHandler异常处理 ClientHttpRequestInterceptor请求拦截器RestTemplate是spring的一个rest客户端,在spring-web这个包下,springboot的依赖如下:
1<dependency> 2<groupId>org.springframework.boot</groupId> 3<artifactId>spring-boot-starter-web</artifactId> 4</dependency>点进去可以看到spring-web
1<dependency> 2<groupId>org.springframework</groupId> 3<artifactId>spring-web</artifactId> 4<version>5.1.9.RELEASE</version> 5</dependency>所以如果在非spring的框架下直接引入spring-web这个包即可。
RestTemplate有三个实现
1packageorg.springframework.web.client; 2 3publicclassRestTemplateextendsInterceptingHttpAccessorimplementsRestOperations{ 4 5... 6 7publicRestTemplate(){ 8... 9} 10 11publicRestTemplate(ClientHttpRequestFactoryrequestFactory){ 12... 13} 14 15publicRestTemplate(List<HttpMessageConverter<?>>messageConverters){ 16... 17} 18}新建一个SpringBootWeb工程,引入依赖spring-boot-starter-web
1<dependency> 2<groupId>org.springframework.boot</groupId> 3<artifactId>spring-boot-starter-web</artifactId> 4</dependency>1、restTemplate获取字符串
****RESTAPI代码
1@RequestMapping(value="/employees",produces=MediaType.TEXT_HTML_VALUE,method=RequestMethod.GET) 2publicStringgetAllEmployeesHtml(Modelmodel) 3{ 4model.addAttribute("employees",employeeMapper.getEmps()); 5return"employees"; 6}REST客户端代码
1//获取字符串 2@Test 3publicvoidtest01(){ 4Stringurl="http://localhost:8080/employees"; 5Stringres1=restTemplate.getForObject(url,String.class); 6System.out.println("getForObject======"+res1); 7}2、使用RestTemplate的自定义HTTP标头
****RESTAPI代码
1@RequestMapping(value="/employees",produces=MediaType.APPLICATION_JSON_VALUE,method=RequestMethod.GET) 2@ResponseBody 3publicList<Employee>getAllEmployeesJSON() 4{ 5returnemployeeMapper.getEmps(); 6}REST客户端代码
//使用RestTemplate的自定义HTTP标头 @Test publicvoidtest02(){ Stringurl="http://localhost:8080/employees"; HttpHeadersheaders=newHttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity<String>entity=newHttpEntity<String>("parameters",headers); ResponseEntity<String>res2=restTemplate.exchange(url,HttpMethod.GET,entity,String.class); System.out.println("exchange======"+res2); }**3、获取响应作为对象**
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.GET) 2@ResponseBody 3publicEmployeeget(@PathVariable("id")Integerid){ 4returnemployeeMapper.getEmpById(id); 5}REST客户端代码
1//获取响应作为对象 2@Test 3publicvoidtest03(){ 4Stringurl="http://localhost:8080/employee/1"; 5 6Employeeres3=restTemplate.getForObject(url,Employee.class); 7System.out.println("getForObject======"+res3); 8} 9 10//获取响应作为对象,并获取响应对象状态 11@Test 12publicvoidtest033(){ 13Stringurl="http://localhost:8080/employee/1"; 14ResponseEntity<Employee>res3=restTemplate.getForEntity(url,Employee.class); 15System.out.println("getStatusCode======"+res3.getStatusCode()); 16System.out.println("getForEntity======"+res3); 17}4、URL参数
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.GET) 2@ResponseBody 3publicEmployeeget(@PathVariable("id")Integerid){ 4returnemployeeMapper.getEmpById(id); 5}REST客户端代码
1//URL参数 2@Test 3publicvoidtest04(){ 4Stringurl="http://localhost:8080/employee/{id}"; 5 6Map<String,String>params=newHashMap<String,String>(); 7params.put("id","1"); 8Employeeres4=restTemplate.getForObject(url,Employee.class,params); 9System.out.println("getForObject======"+res4); 10}5、HTTPPOST方法
RESTAPI代码
1@RequestMapping(value="/employee",method=RequestMethod.POST) 2@ResponseBody 3publicStringsave(@RequestBodyEmployeeemployee){ 4System.out.println("post===="+employee); 5return"success"; 6}REST客户端代码
1//HTTPPOST方法 2@Test 3publicvoidtest05(){ 4Stringurl="http://localhost:8080/employee"; 5 6EmployeenewEmployee=newEmployee(-1,"小黑","1","test@email.com"); 7Stringres5=restTemplate.postForObject(url,newEmployee,String.class); 8System.out.println("postForObject======"+res5); 9}6、HTTPPUT方法示例
RESTAPI代码
1@RequestMapping(value="/employee",method=RequestMethod.PUT) 2@ResponseBody 3publicStringupdate(@RequestBodyEmployeeemployee){ 4System.out.println("put===="+employee); 5return"success"; 6}REST客户端代码
1//HTTPPUT方法示例 2@Test 3publicvoidtest06(){ 4Stringurl="http://localhost:8080/employee"; 5EmployeenewEmployee=newEmployee(-1,"小黑","1","test@email.com"); 6restTemplate.put(url,newEmployee); 7}7、HTTPDELETE方法示例
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.DELETE) 2@ResponseBody 3publicStringdelete(@PathVariable("id")Integerid){ 4System.out.println("delete===="+id); 5return"success"; 6}REST客户端代码
1//HTTPDELETE方法示例 2@Test 3publicvoidtest07(){ 4Stringurl="http://localhost:8080/employee/1"; 5restTemplate.delete(url); 6}本文内容总结:RestTemplate介绍,RestTemplate实现,RestTemplate使用,
原文链接:https://www.cnblogs.com/h--d/p/12609753.html