RestTemplate
很LOW,作为了解
RestTemplate 有Spring框架提供的一个用于 后端服务器模拟发送HTTP请求的一种技术
它支持所有的HTTP标准方法,包含:GET,POST,PUT,DELETE
调用第3方接口
见:《01-Spring项目调用外部服务器》
调用子系统的接口
1、在基础微服务中,暴露一些接口
在marketmag/controller中
/**
* 市场管理表现层
* 对于前端/微服务来讲,这就是暴露出来的接口
*/
@RestController
@RequestMapping("/market")
public class MarketController {
/**
* 新增接口
* @param marketInfo
* @return
*/
@PostMapping(value = "/more",produces = MediaType.APPLICATION_JSON_VALUE)
public String saveMarket(MarketInfo marketInfo){
System.out.println(marketInfo);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功").build());
}
/**
* 修改接口
* @param marketInfo
* @return
*/
@PutMapping(value = "/{id}",produces = MediaType.APPLICATION_JSON_VALUE)
public String updateMarket(MarketInfo marketInfo,@PathVariable("id") Integer id){
System.out.println(marketInfo);
System.out.println(id);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功").build());
}
/**
* 删除
* @param id
* @return
*/
@DeleteMapping(value = "/{id}",produces = MediaType.APPLICATION_JSON_VALUE)
public String deleteMarket(@PathVariable("id") Integer id){
System.out.println(id);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功").build());
}
/**
* 查询
* @param marketInfo
* @return
*/
@GetMapping(value = "/all",produces = MediaType.APPLICATION_JSON_VALUE)
public String findAllByParams(MarketInfo marketInfo){
List<MarketInfo> datas = new ArrayList<>();
MarketInfo m1 = new MarketInfo();
m1.setMarketName("市场1");
MarketInfo m2 = new MarketInfo();
m2.setMarketName("市场2");
datas.add(m1);
datas.add(m2);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功").data(datas).build());
}
}
2、在用户微服务中,调用上述接口
配置RestTemplate实例
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
/**
* 产生一个RestTemplate 模板对象
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
GET调用
@RequestMapping("/rest")
@RestController
public class RestTemplateController {
@Resource
private RestTemplate restTemplate;
/**
* GET调用
* @return
*/
@GetMapping(value = "/get",produces = MediaType.APPLICATION_JSON_VALUE)
public String test01(){
String res = restTemplate.getForObject(getUrl()+"market/all",String.class);
System.out.println(res);
return res;
}
public String getUrl(){
return "http://127.0.0.1:9091/";
}
}
POST调用
/**
* Post调用
* @return
*/
@PostMapping(value = "/post", produces = MediaType.APPLICATION_JSON_VALUE)
public String test02(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add("id", "1");
map.add("marketName", "市场1");
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, headers);
ResponseEntity<String> res = restTemplate.postForEntity(getUrl()+"market/more",httpEntity,String.class);
System.out.println(res.getBody());
return res.getBody();
}
Put调用
/**
* PUT调用
* @return
*/
@PutMapping(value = "/put", produces = MediaType.APPLICATION_JSON_VALUE)
public String test03(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add("id", "12");
map.add("marketName", "市场1");
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, headers);
restTemplate.put(getUrl()+"market/{1}",httpEntity,12);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功!").build());
}
DELETE调用
/**
* DELETE调用
* @return
*/
@DeleteMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
public String test04(){
//{1} 代表的是路径参数的占位符
restTemplate.delete(getUrl()+"market/{1}",12);
return JSONObject.toJSONString(ResponseMsg.builder().code(200).msg("操作成功!").build());
}
**注意:**RestTemplate 一定要有详细的路径 http://127.0.0.1:9091/market/more
它没有提供任何的负载均衡的说法,也不能自动切换请求地址,如果请求地址出现问题,我们微服务调用就直接失败
解决方案:
请学习下一个更换技术,Ribbon