需求:项目调用公共服务区提供的接口
方法一:FeignClient
适用于都注册在远程服务托管中心的服务之间的调用,如Eurake,Nacos之类
导入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
yml配置
spring:
application:
name: qdchess-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#适用于运行于同一个服务器之间的参数
#不在同一个服务器的话就填对应地址
FeignClient接口编写:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
/**
* @Author Diuut
* @Date 2020/10/13 9:55
*/
@FeignClient(name = "qdchess-cmd")
public interface CmdFeignClient {
//接收方直接接收String格式,拿到的就是一串String
//如需要json格式的话就带@requestBody注解
@RequestMapping(value = "/wxpay",consumes = "text/plain",headers = "")
public String wxpay(@RequestParam String request);
@RequestMapping(value = "wxpay/verify")
public String wxcallback(@RequestBody String request);
@RequestMapping(value = "/alipay",method = RequestMethod.POST)
public String alipay(@RequestBody String request);
@RequestMapping(value = "alipay/verify")
public String alicallback(@RequestBody String request);
}
//根据调用接口不同,收发参数接收发送方式也不同
剩下的就只需要注入,然后就像调用一个方法一样直接调用接口即可,如果遇到延迟较大超时等问题,就需要在yml自己配置超时时间。
方法二:RestTemplate
添加Config类
@Configuration
public class RestTemplateConfig{
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) {
if(httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("utf8"));
break;
}
}
return restTemplate;
}
}
为方便使用的话也编写一个类用于调用,也可以直接在其他方法里调用
/** * @Author Diuut * @Date 2020/10/15 10:03 */ @Component @Slf4j public class RestTemplateClient { @Autowired private RestTemplate restTemplate; public String wxpay(String str){ return restTemplate.postForObject("http://qdchess-cmd/wxpay",str, String.class); } public String wxcallback(String str){ return restTemplate.postForObject("http://qdchess-cmd/wxpay/verify",str, String.class ); } public String alipay(String str){ return restTemplate.postForObject("http://qdchess-cmd/alipay",str, String.class ); } public String alicallback(String str){ return restTemplate.postForObject("http://qdchess-cmd/alipay/verify",str, String.class ); } public String applecallback(String str){ return restTemplate.postForObject("http://qdchess-cmd/alipay/verify",str, String.class ); } } //也可以设定不同的传参方式
方法三:WebClient
第三个方式更多的针对于webFlux中的写法,如果与普通的阻塞写法混用的话,因为异步的原因,无法获取调用接口响应的数据,因此不太方便,不建议优先使用,这里便省略。