今天我来说说restTemplate吧,它是spring提供的一种远程调用服务的方式,底层封装了httpClient。我之前讲过的webservice是另一种远程调用服务的方式,它是基于http+xml的,平台无关性强。而httpclient是基于http的,一般用于浏览器发送,平台无关性弱。
执行Get类型的Url,返回响应ResponseEntity
或自己定义返回类型
|
getForEntity(java.lang.String url, java.lang.Class |
|
getForEntity(java.lang.String url, java.lang.Class |
|
getForEntity(java.net.URI url, java.lang.Class |
|
getForObject(java.lang.String url, java.lang.Class |
|
getForObject(java.lang.String url, java.lang.Class |
|
getForObject(java.net.URI url, java.lang.Class |
执行Post类型的Url,返回响应ResponseEntity
或自己定义返回类型
|
postForEntity(java.lang.String url, java.lang.Object request, java.lang.Class |
|
postForEntity(java.lang.String url, java.lang.Object request, java.lang.Class |
|
postForEntity(java.net.URI url, java.lang.Object request, java.lang.Class |
|
postForObject(java.lang.String url, java.lang.Object request, java.lang.Class |
|
postForObject(java.lang.String url, java.lang.Object request, java.lang.Class |
|
postForObject(java.net.URI url, java.lang.Object request, java.lang.Class |
执行del类型的Url
void |
delete(java.lang.String url, java.util.Map |
void |
delete(java.lang.String url, java.lang.Object... uriVariables) |
void |
delete(java.net.URI url) |
执行Put类型的Url
void |
put(java.lang.String url, java.lang.Object request, java.util.Map |
void |
put(java.lang.String url, java.lang.Object request, java.lang.Object... uriVariables) |
void |
put(java.net.URI url, java.lang.Object request) |
执行给定Url,并指定的请求RequestEntity
,最后返回响应ResponseEntity
。
|
exchange(RequestEntity> requestEntity, java.lang.Class
|
|
exchange(RequestEntity> requestEntity, ParameterizedTypeReference |
|
exchange(java.lang.String url, HttpMethod method, HttpEntity> requestEntity, java.lang.Class |
|
exchange(java.lang.String url, HttpMethod method, HttpEntity> requestEntity, java.lang.Class |
|
exchange(java.lang.String url, HttpMethod method, HttpEntity> requestEntity, ParameterizedTypeReference |
|
exchange(java.lang.String url, HttpMethod method, HttpEntity> requestEntity, ParameterizedTypeReference |
|
exchange(java.net.URI url, HttpMethod method, HttpEntity> requestEntity, java.lang.Class |
|
exchange(java.net.URI url, HttpMethod method, HttpEntity> requestEntity, ParameterizedTypeReference |
主要选择get和post方式进行介绍
定义一个服务端:
package com.example.demo.controller;
import com.example.demo.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by linjiaming
*/
@RestController
public class TestController {
@GetMapping("/getUser")
public User getUser() {
User u = new User();
u.setName("getUser");
return u;
}
@PostMapping("/postUser")
public User postUser () {
User u = new User();
u.setName("postUser");
return u;
}
@PostMapping("/postUserByName")
public User postUser (@RequestBody User u) {
return u;
}
}
分别是get,post无参,post有参方式
package com.example.demo.controller;
import com.example.demo.entity.User;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* Created by linjiaming
*/
@RestController
public class TestController {
@Autowired
RestTemplate restTemplate;
private static String GET_URL = "http://localhost:8080/getUser";
private static String POST_URL = "http://localhost:8080/postUser";
private static String POST_PARAM_URL = "http://localhost:8080/postUserByName";
/**
* 测试无参情况
* @return
*/
@GetMapping("/testgetUser")
public User getUser() {
//getForObject方式
User user = restTemplate.getForObject(GET_URL, User.class);
//getForEntity方式
/*ResponseEntity entity = restTemplate.getForEntity(GET_URL, User.class);
User user = entity.getBody();*/
return user;
}
@GetMapping("/testpostUser")
public User postUser () {
//PostForObject方式
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
String data = "";
HttpEntity Entity = new HttpEntity(data, headers);
User user = restTemplate.postForObject(POST_URL, Entity, User.class);
//PostForEntity方式
/* HttpHeaders headers = new HttpHeaders();
String data = "";
HttpEntity Entity = new HttpEntity(data, headers);
ResponseEntity entity = restTemplate.postForEntity(POST_URL, Entity, User.class);
User user = entity.getBody();*/
return user;
}
@GetMapping("/testpostUserByName")
public User postUserByName () {
//PostForObject方式
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
User u = new User();
u.setName("lisi");
u.setAge("18");
HttpEntity Entity = new HttpEntity(u,headers);
User user = restTemplate.postForObject(POST_PARAM_URL, Entity, User.class);
return user;
}
}
在定义这个controller之前,还需要配置restTemplate:
package com.example.demo.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;
/**
* Created by linjiaming
*/
@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(15000);//ms
return factory;
}
}
接下来可以测试一下效果了:
分别启动服务端(port:8080)和客户端(port:8081)
地址栏输入:http://localhost:8081/testgetUser
结果:{"name":"getUser","age":null}
地址栏输入:http://localhost:8081/testpostUser
结果:{"name":"postUser","age":null}
地址栏输入:http://localhost:8081/testpostUserByName
结果:{"name":"lisi","age":"18"}