1.SpringMvc中已经依赖了RestTemplate,可以注入直接使用。RestTemplate的底层可以使用第三方的http客户端工具实现http 的请求,常用的http客户端工具有Apache HttpClient、OkHttpClient等
2.替换http客户端工具为OkHttpClient
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.9.1</version>
</dependency>
3.注入RestTemplate
@Bean
public RestTemplate restTemplate(){
// return new RestTemplate();
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
4.测试过程中Controller中的方法:
@GetMapping("/user/{id}")
public User queryById(@PathVariable Long id, String name){
System.out.println(id+"----"+name);
return userService.queryById(id);
}
@PostMapping("/user/add")
public User add(@RequestBody User user){
System.out.println(user);
return user;
}
@PostMapping("/user/add2")
public User add2(User user){
System.out.println(user);
return user;
}
5.测试restTemplate的api方法
//get请求
@Test
public void test(){
String url = "http://localhost/user/1";
//restTemplate可以对json格式字符串进行反序列化
User user = restTemplate.getForObject(url, User.class);
System.out.println("user:"+user);
ResponseEntity<Map> forEntity = restTemplate.getForEntity(url, Map.class);
Map map = forEntity.getBody();
System.out.println("forEntity:"+map);
ResponseEntity<User> get = restTemplate.exchange(url+"?name=lisi", HttpMethod.GET, null, User.class);
System.out.println("get exchange:"+ get.getBody());
}
//提交json数据
@Test
public void testPostJsonData(){
String addUrl = "http://localhost/user/add";
User user = new User();
user.setName("王五");
user.setSex(1);
user.setUserName("wangwu");
ResponseEntity<Map> postForEntity = restTemplate.postForEntity(addUrl, user, Map.class);
Map forEntityBody = postForEntity.getBody();
System.out.println("postForEntity:"+forEntityBody);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
Map bodyMap = new HashMap();
bodyMap.put("userName","zhangsan");
bodyMap.put("password","123456");
bodyMap.put("name","张三");
bodyMap.put("age","15");
HttpEntity<Map> httpEntity = new HttpEntity<Map>(bodyMap, headers);
ResponseEntity<User> post = restTemplate.exchange(addUrl, HttpMethod.POST, httpEntity, User.class);
System.out.println("post exchange:"+ post.getBody());
}
//提交表单数据
@Test
public void testPostFormData(){
String addUrl = "http://localhost/user/add2";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//Map bodyMap = new HashMap();
//bodyMap.put("userName","zhaoliu");
//bodyMap.put("password","123456");
//bodyMap.put("name","赵六");
//bodyMap.put("age","15");
//HttpEntity<Map> requestEntity = new HttpEntity<Map>(bodyMap, headers);
//封装参数,千万不要替换为Map与HashMap,否则参数无法传递
MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
params.add("userName", "zhaoliu");
params.add("password", "123456");
params.add("name", "赵六");
params.add("age", "37");
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
ResponseEntity<User> post = restTemplate.exchange(addUrl, HttpMethod.POST, requestEntity, User.class);
System.out.println("post exchange:"+ post.getBody());
}
Post请求提交表单数据
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
public class TestRestTemplat{
public static String Test(RestTemplate restTemplate) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("header1", "header1");
httpHeaders.add("header2", "header2");
httpHeaders.add("header3", "header3");
httpHeaders.add("header4", "header4");
httpHeaders.add("Content-Type", "application/x-www-form-urlencoded");
MultiValueMap<String,String> body = new LinkedMultiValueMap<>();
body.add("param1", "param1");
body.add("param2", "param2");
body.add("param3", "param3");
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(body, httpHeaders);
ResponseEntity<Map> response = restTemplate.postForEntity("url", httpEntity, Map.class);
//response.getBody获得响应体的内容.get("filed")可以获取响应体的某个filed对应的值
return response.getBody().get("filed");
}
}