不善于言谈、不善笔墨、更不善交际..为何坚持写作?
虽如此,但是个人有一颗分享的心,有满腔的热情,更坚信只要坚持写作就能有所提升,就能受益于更多的人那就足够了。
未来又有何惧,编程之路需要小伙伴的相互扶持,所以徘徊在编程技能无法提升到的朋友应该试着突破下自己,让程序员发挥更大的价值。
一路走来,感谢有你,曾今有多少次想放弃这种分享(累)?曾经有多少个加班夜~回家尚需继续“奋斗”(一般晚上11点下班,再坚持写篇分享大约凌晨1点多)?
虽然已走向管理型技术岗位(工作上自己把控时间多些,可专注于技术研究),但是为什么觉得累了呢?
一切的一切只有经历的人才能更深一层的体会,不管如何2018年已过去,再多的苦言也随它而去,感谢关注我的小伙伴,你们收获的不是一篇一篇可估量有价值的文章,而是工作当中遇到问题,我愿竭尽全力与你共同寻求解决方案,编程之路有你们不孤单,向我的811个好友致谢!加油。
伴随SpringBoot专栏(入门篇)的第19讲也是2019年的第一天,这个栏目到这就结束了。迎接我们是崭新的一年,崭新的计划,大家准备好了吗?@架构师速成记
本篇将简单介绍RestTemplate中的几个常用方法,也希望在以后微服务实践过程中该技能有所帮助。
主要从以下四个方面来介绍RestTemplate的使用:
本篇以springboot-12-resttemple模块为demo讲解(代码已上传)
service创建
package com.limp.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
/**
* @intro :
* @auth : shinians
* @time : 2019/1/1 0:57
* @website: shinians
*/
@Service
public class ApiService {
private Logger logger= LoggerFactory.getLogger(ApiService.class);
@Autowired
RestTemplate restTemplate;
//定义访问ip
public String IP="http://localhost:8080";
/**
* 通过get方式发送请求【1】
*/
public void getObjectByGet(){
// 调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式,如下:
//第一种:参数动态扩展
String result1 = restTemplate.getForObject(IP+
"/api/users?name={1}&age={2}", String.class,"李白",23);
logger.info("第一种:输出结果{}",result1);
//第二种
Map map = new HashMap<>();
map.put("name", "李白");
String quote = restTemplate.getForObject(IP+
"/api/users?name={name}", String.class,map);
logger.info("第二种:输出结果{}",quote);
}
/**
* 第二种方式
*/
public void getForEntityByGet(){
ResponseEntity responseEntity = restTemplate.getForEntity(IP+
"/api/users?name={1}&age={2}", String.class,"李白",23);
String body = responseEntity.getBody();
HttpStatus statusCode = responseEntity.getStatusCode();
int statusCodeValue = responseEntity.getStatusCodeValue();
HttpHeaders headers = responseEntity.getHeaders();
logger.info(body);
logger.info(statusCode.toString());
logger.info(statusCodeValue+"");
logger.info(headers.toString());
}
/**
* post请求测试
*/
public void getObjectByPost(){
Map map = new HashMap<>();
map.put("name", "李白");
String resp = restTemplate.postForObject(IP+"/api/user", map, String.class);
logger.info("返回结果");
logger.info(resp);
}
/**
* PUT 请求测试
*/
public void getObjectByPut(){
Map map = new HashMap<>();
map.put("name", "李白");
restTemplate.put(IP+"/api/user", map);
logger.info("日志请查看controller");
}
/**
* del 请求测试
*/
public void getObjectByDel(){
// Map map = new HashMap<>();
// map.put("name", "李白");
restTemplate.delete(IP+"/api/user/12");
logger.info("日志请查看controller");
}
public void test(){
/**
* 说明:
1)url: 请求地址;
2)method: 请求类型(如:POST,PUT,DELETE,GET);
3)requestEntity: 请求实体,封装请求头,请求内容
4)responseType: 响应类型,根据服务接口的返回类型决定
5)uriVariables: url中参数变量值
*/
}
}
controller层(包含增删改查等方法,供service调用)
@RestController
public class ApiController {
Logger logger= LoggerFactory.getLogger(ApiController.class);
@GetMapping("/api/users")
public String getUsersInfo(User user){
logger.info("get查询方法");
return "返回结果:通过get方式查询users传参"+user.toString();
}
@GetMapping("/api/user/{id}")
public String getUserInfo(@PathVariable String id){
User user=new User("springboot",23,id);
logger.info("get 方法");
return user.toString();
}
/**
* 新增用户并返回用户信息
* @param user
* @return
*/
@PostMapping("/api/user")
public String addUserInfo(@RequestBody User user){
logger.info("post 新增用户方法");
logger.info(user.toString());
return user.toString();
}
/**
* 新增用户并返回用户信息
* @param id
* @return
*/
@DeleteMapping("/api/user/{id}")
public String delUserInfo(@PathVariable String id){
logger.info("delete 删除用户方法"+id);
return "用户删除成功id:"+id;
}
/**
* 注意:@RequestBody不添加,rest请求过来的user是为空的
* 修改用户并返回用户信息
* @param user
* @return
*/
@PutMapping("/api/user")
public String updateUserInfo(@RequestBody User user){
logger.info("put 修改用户方法");
logger.info(user.toString());
return user.toString();
}
}
测试类(分别调用service中方法):
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot12ResttempleApplicationTests {
@Test
public void contextLoads() {
}
@Autowired
ApiService apiService;
@Test
public void testGet(){
apiService.getObjectByGet();
}
@Test
public void testGet2(){
apiService.getForEntityByGet();
}
@Test
public void testPost(){
apiService.getObjectByPost();
}
@Test
public void testPut(){
apiService.getObjectByPut();
}
@Test
public void testDel(){
apiService.getObjectByDel();
}
}
以get方法为例:发送一个GET请求,我们可以通过两种方式(第三种方式最后简单提下,但是是最灵活,最有用的一种,此篇暂不进行讨论)
1)以getForEntity的方式去请求
getForEntity的第一个参数为要调用的服务的地址,为ip/api/users?name={1}&age={2}
getForEntity第二个参数String.class表示返回的body类型是String
返回的ResponseEntity包含了响应体所映射成的对象
2) getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
有时候我在调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式
可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值
Post、put、Delete请求方式类似
POST请求 postForEntity和postForObject
PUT请求:restTemplate.put
DELETE请求:restTemplate.delete
在RestTemplate中,PUT\delete请求可以通过put、delete方法调用,这两者的参数和前面介绍的getForEntity方法的参数基本一致,只是put、delete方法没有返回值而已。
restTemplate.exchange(
String url,
HttpMethod method,
HttpEntity requestEntity,
Class responseType,
Object uriVariables[]
)
说明:
1)url: 请求地址;
2)method: 请求类型(如:POST,PUT,DELETE,GET);
3)requestEntity: 请求实体,封装请求头,请求内容
4)responseType: 响应类型,根据服务接口的返回类型决定
5)uriVariables: url中参数变量值
这种方式因为是最灵活的一种,现在我们采用是这种方式调用,感兴趣的可以了解下。
代码下载:https://github.com/shinians/springboot-demos
下个栏目决定精心打磨,做出更加优质原创文章,SpringBoot专栏到此阶段性结束,谢谢陪伴
我在下个专栏等你,定不负众望,等你 @架构师速速记