1. 调用第三方接口时,RestTemplate提供了比较方便的相关方法:
1)getForObject(String url, Class<T> responseType, Object... uriVariables)
2) getForEntity(String url, Class<T> responseType, Object... uriVariables)
3) postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
4) postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables)
2. 但是使用RestTemplate需要注意的一些地方:
如果项目中使用了负载均衡的相关配置,则注入RestTemplate时,要指定注入方式,以支持负载均衡。
如:@Qualifier(value="restful")
@Autowired private RestTemplate restTemplate;
否则,就会报负载均衡的相关错误:
java.lang.IllegalStateException: No instances available for hq.sinajs.cn
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:75);
但是注意:
当通过restTemplate调用的是同项目内部的其他微服务时,@Qualifier(value="restful")则是万万不能加上的,这会让服务调用者认为这是远程服务调用。
如:String url = "http://{msName}/common/quartz/executeJob";
String msName = scheduleVO.getMsName(); -- 此为动态获取的微服务名
restTemplate.postForEntity(url, reqEntity, Result.class, msName);
将会报错:org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://system/common/quartz/executeJob": system; nested exception is java.net.UnknownHostException: system,
这是因为调用者将system当成远程服务的域名/ip,故此解析出错。