SpringBoot专栏:RestTemplate基本使用与微服务藕断丝连(终结-告别篇)

SpringBoot专栏:RestTemplate基本使用与微服务藕断丝连(终结-告别篇)_第1张图片

有话要说

不善于言谈、不善笔墨、更不善交际..为何坚持写作?

虽如此,但是个人有一颗分享的心,有满腔的热情,更坚信只要坚持写作就能有所提升,就能受益于更多的人那就足够了。

未来又有何惧,编程之路需要小伙伴的相互扶持,所以徘徊在编程技能无法提升到的朋友应该试着突破下自己,让程序员发挥更大的价值。

一路走来,感谢有你,曾今有多少次想放弃这种分享(累)?曾经有多少个加班夜~回家尚需继续“奋斗”(一般晚上11点下班,再坚持写篇分享大约凌晨1点多)?

虽然已走向管理型技术岗位(工作上自己把控时间多些,可专注于技术研究),但是为什么觉得累了呢?

一切的一切只有经历的人才能更深一层的体会,不管如何2018年已过去,再多的苦言也随它而去,感谢关注我的小伙伴,你们收获的不是一篇一篇可估量有价值的文章,而是工作当中遇到问题,我愿竭尽全力与你共同寻求解决方案,编程之路有你们不孤单,向我的811个好友致谢!加油。

SpringBoot专栏:RestTemplate基本使用与微服务藕断丝连(终结-告别篇)_第2张图片

伴随SpringBoot专栏(入门篇)的第19讲也是2019年的第一天,这个栏目到这就结束了。迎接我们是崭新的一年,崭新的计划,大家准备好了吗?@架构师速成记

SpringBoot专栏:RestTemplate基本使用与微服务藕断丝连(终结-告别篇)_第3张图片

正文:

本篇将简单介绍RestTemplate中的几个常用方法,也希望在以后微服务实践过程中该技能有所帮助。

主要从以下四个方面来介绍RestTemplate的使用:

  • GET请求
  • POST请求
  • PUT请求
  • DELETE请求

Demo开始

本篇以springboot-12-resttemple模块为demo讲解(代码已上传)

SpringBoot专栏:RestTemplate基本使用与微服务藕断丝连(终结-告别篇)_第4张图片

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方法没有返回值而已。

使用exchange指定调用方式

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中参数变量值

这种方式因为是最灵活的一种,现在我们采用是这种方式调用,感兴趣的可以了解下。

End

代码下载:https://github.com/shinians/springboot-demos

下个栏目决定精心打磨,做出更加优质原创文章,SpringBoot专栏到此阶段性结束,谢谢陪伴

我在下个专栏等你,定不负众望,等你 @架构师速速记

你可能感兴趣的:(Spring,Boot,SpringBoot入门,ResTemplate,SpringBoot)