记一次学习成长的过程:
在学习 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(); 方法来获取方法请求的结果。