RestTemplate方式实现RPC远程调用

记一次学习成长的过程:
在学习 springcloud 的时候,其中在 rest 风格的使用的时候,因为上课老师就讲了一种 get 的方法,然后在进行 CRUD 的时候,我也照用这个方法,没错它就是 :

/**
     * @param id
     * @Description 根据主键查询
     * @Return java.lang.String
     * @Author 小白的 Soda
     * @Date Created in 2021/6/15 19:50
     **/
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String queryById(@PathVariable("id") Long id) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() + "/bill/" + id;
        return restTemplate.getForObject(url, String.class);
    }

此方法能够通过 get 请求获取到我想要的结果,但是在进行其他方法的时候,我发现,好像有点行不通。通过多方查阅资料,发现 RestTemplate 针对不同的请求方法,都提供了不同的方法。
具体先看代码吧,慢慢探索出来的可行之道:
springboot启动类:

package com.soda;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author Mr Bai`s Soda
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

controller:

package com.soda.controller;

import com.soda.entity.Bill;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: Mr Bai`s Soda
 * @Description:
 * @Date Created in  2021-06-10 19:33
 * @Modified By:
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * @param
     * @Description 获取 ServiceInstance 实例
     * @Return org.springframework.cloud.client.ServiceInstance
     * @Author 小白的 Soda
     * @Date Created in 2021/6/15 20:10
     **/
    public ServiceInstance getServiceInstance() {
        List<ServiceInstance> instances = discoveryClient.getInstances("bill-service");
        ServiceInstance serviceInstance = instances.get(0);
        return serviceInstance;
    }

    /**
     * @param pageNum
     * @param pageSize
     * @param bill
     * @Description 按条件分页查询
     * @Return java.lang.String
     * @Author 小白的 Soda
     * @Date Created in 2021/6/15 19:11
     **/
    @GetMapping("/list")
    public String list(@RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "10") int pageSize,
                       Bill bill) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() + "/bill/list" +
                "?pageNum=" + pageNum + "&pageSize=" + pageSize + "&typeId=" + bill.getTypeId() +
                "&date1=" + bill.getDate1() + "&date2=" + bill.getDate2();
        return restTemplate.getForObject(url, String.class);
    }

    /**
     * @param b
     * @Description 添加一个账单类型
     * @Return java.lang.String
     * @Author Mr Bai's Soda
     * @Date Created in 2021/6/1 8:19
     **/
    @RequestMapping(method = RequestMethod.POST)
    public String add(Bill b) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() + "/bill";
        return restTemplate.postForObject(url, b, String.class);
    }

    /**
     * @param id
     * @Description 根据主键删除账单
     * @Return java.lang.String
     * @Author Mr Bai's Soda
     * @Date Created in 2021/6/1 8:22
     **/
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") Long id) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() + "/bill/" + id;
        ResponseEntity<String> result = restTemplate.exchange(url, HttpMethod.DELETE, null, String.class);
        return result.getBody();
    }

    /**
     * @param id
     * @Description 根据主键查询
     * @Return java.lang.String
     * @Author 小白的 Soda
     * @Date Created in 2021/6/15 19:50
     **/
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String queryById(@PathVariable("id") Long id) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() + "/bill/" + id;
        return restTemplate.getForObject(url, String.class);
    }

    /**
     * @param id
     * @param bill
     * @Description 更新
     * @Return java.lang.String
     * @Author 小白的 Soda
     * @Date Created in 2021/6/15 20:00
     **/
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public String update(@PathVariable("id") Long id, Bill bill) {
        String url = "http://" + getServiceInstance().getHost() + ":" + getServiceInstance().getPort() +
                "/bill/" + id + "?title={title}&billTime={billTime}&typeId={typeId}&price={price}&explain={explain}";
        Map<String, Object> param = new HashMap<>();
            param.put("title", bill.getTitle());
            param.put("billTime", bill.getBillTime());
            param.put("typeId", bill.getTypeId());
            param.put("price", bill.getPrice());
            param.put("explain", bill.getExplain());
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, null, String.class, param);
        return response.getBody();
    }
}

注意:put,delete 请求方法无返回值,所以,思来想去,为了拿到我想要的返回结果,选用了通用方法:exchange,利用 exchange的执行返回对象的.getBody(); 方法来获取方法请求的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白的Soda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值