1. 简介
在Springboot项目中,存在需要访问外部模块接口,或者外部URL链接的需求,下面就介绍三种调用外部接口的方式(不使用dubbo的方式)
2. 使用原始HttpClient请求
1 |
|
3. 使用RestTemplate方法
在Springboot开发中,RestTemplate
同样提供了对外访问的接口API。
3.1. Get请求
提供了getForObject
、getForEntity
两种方式,其中getForEntity
如下三种方法实现:
getForEntity(URI url, Class responseType)
1
2
3
4
5
6
7
8
9//该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是JDK java.net包下的一个类,表示一个统一资源标识符(Uniform Resource Identifier)引用。参考如下:
RestTemplate restTemplate=new RestTemplate();
UriComponents
uriComponents=UriComponentsBuilder.fromUriString("http://USER-SERVICE/user?name={name}")
.build()
.expand("dodo")
.encode();
URI uri=uriComponents.toUri();
ResponseEntityresponseEntity=restTemplate.getForEntity(uri,String.class).getBody();getForEntity(Stringurl,Class responseType,Object…urlVariables)
1
2
3
4
5
6//该方法提供了三个参数,其中url为请求的地址,responseType为请求响应body的包装类型,urlVariables为url中的参数绑定,该方法的参考调用如下:
// http://USER-SERVICE/user?name={name)
RestTemplate restTemplate=new RestTemplate();
Mapparams=new HashMap<>();
params.put("name","dada"); //
ResponseEntityresponseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);
getForObject
,存在以下三种方式重载:
1 | getForObject(String url,Class responseType,Object...urlVariables) |
getForObject
方法可以理解为对getForEntity
的进一步封装,它通过HttpMessageConverterExactor
对Http请求响应体body内容进行对象转化,实现请求直接返回包装好的对象内容。
3.2. Post请求
ost请求提供有postForEntity
、postForObject
和postForLocation
三种方式,其中每种方式都有三种方法,下面介绍postForEntity
的使用方法。
postForEntity
,存在以下三种方式重载:
1 | postForEntity(String url,Object request,Class responseType,Object... uriVariables) |
如下仅演示第二种重载方式:
1 | public String submit(String documentId){ |
4. 使用Feign进行消费
在maven项目中添加依赖
1
2
3
4
5<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>在启动类上加上
@EnableFeignClients
1
2
3
4
5
6
7
public class ChapterApplication {
public static void main(String[] args) {
SpringApplication.run(MobilecardApplication.class, args);
}
}此处编写接口模拟外部接口供feign调用外部接口方式使用
定义service以及controller
1
2
3
4
5
6
7
8
9
10
11
public interface PrintService {
public String print(TestDto testDto);
}
public class PrintServiceImpl implements PrintService {
public String print(TestDto testDto) {
return "模拟外部系统的接口功能"+testDto.getId();
}
}1
2
3
4
5
6
7
PrintService printService;
public String test( TestDto testDto){
return printService.print(testDto);
}定义FeignService
1
2
3
4
5
6
7
8//此处name需要设置不为空,url需要在.properties中设置
public interface FeignService {
public String getMessage( TestDto testDto);
}定义调用Controller
1
2
3
4
5
6
7
FeignService feignService;
//测试feign调用外部接口入口
public String test( TestDto testDto){
return feignService.getMessage(testDto);
}postman测试
4.1. 补充信息
添加Header解决方法
将token等信息放入Feign请求头中,主要通过重写RequestInterceptor的apply方法实现
定义config
1
2
3
4
5
6
7
8
public class FeignConfig implements RequestInterceptor {
public void apply(RequestTemplate requestTemplate) {
//添加token
requestTemplate.header("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ");
}
}定义service
1
2
3
4
5
6
7
public interface TokenDemoClient {
public String getMessage( TestDto testDto);
}定义Controller
1
2
3
4
5//测试feign调用外部接口入口,加上token
public String test4( TestDto testDto){
return tokenDemoClient.getMessage(testDto);
}
参考作者:Chelsea
的文章:Springboot中调用外部接口的三种方式