一款輕量級的聲明式http調用工具!
- 2021 年 4 月 28 日
- 筆記
前沿
項目中我們經常會使用HTTP工具向外部的REST介面發送請求,大家一般使用Okhttp,或者java的HttpClient發起,今天給大家介紹一款輕量級聲明式的Http庫(FeignClient),使用起來會使我們的項目程式碼更整潔,利於維護!
快速開始
Feign是spring cloud中服務消費端的調用框架,通常與ribbon,hystrix等組合使用。 但是在某些項目中,由於遺留原因,整個系統並不是spring cloud項目,甚至不是spring項目,而使用者關注的重點僅僅是簡化http調用程式碼的編寫。 如果採用httpclient或者okhttp這樣相對較重的框架,對初學者來說編碼量與學習曲線都會是一個挑戰,而使用spring中RestTemplate,又沒有配置化的解決方案,由此想到是否可以脫離spring cloud,獨立使用Feign。
-
引入依賴
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.18.0</version>
</dependency>
<!-- //mvnrepository.com/artifact/com.netflix.feign/feign-gson -->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-gson</artifactId>
<version>8.18.0</version>
</dependency>
-
定義介面
public interface OuterService {
@RequestLine("GET /requesr/list?name={name}")
@Headers("Authorization: Basic {token}")
String request(@Param(value = "name") String name,@Param(value = "token") String token);
}
通過@RequestLine指定HTTP請求方式及URL地址,@Param指定參數,可以在url或者header中使用{參數名}去填充請求參數。
-
配置類
OuterService service = Feign.builder()
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "//127.0.0.1:8085");
-
開始調用
service.request("test","ad12hj3bhj1b23hj1b2");
json序列化
在項目中,我們發起的Http請求往往都是json格式,feign同樣提供基於json的對象轉換工具,方便我們直接以對象形式交互。
-
介面層面指定header:
@Headers({"Content-Type: application/json","Accept: application/json"})
-
指定Encoder跟Decoder
## 指定Gson序列化。也可以使用Jackson序列化(引入其依賴)
OuterService service = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "//127.0.0.1:8085");
支援我們完成聲明式Http介面調用
使用攔截器
在配置代理類時可以自定義攔截器
OuterService service = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.requestInterceptor(template -> {
// template 可以獲取/修改body,header等資訊
})
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "//127.0.0.1:8085");
註解詳解
-
@RequestLine(“GET /messages/detail”)
指定請求方式跟請求URL
## get請求
@RequestLine("GET /messages/detail?msg_ids={msgIds}")
## post請求
@RequestLine("POST /messages/detail?msg_ids={msgIds}")
-
@Param(“name”)
綁定參數別名,可以在RequestLine/body/headers等註解中通過{參數名}去獲取值。
-
@Headers({“Accept:/“, “Accept-Language: zh-cn”})
指定請求header
-
@Body(“{name}”)
指定請求返回body值為請求參數name
-
@QueryMap
只能標註在方法參數上。用於傳遞多個查詢值,拼接在URL後面,只能標註在Map類型的參數前面,否則報錯。
-
@HeaderMap
同上,只是用在Header上而已
END
歡迎關注公眾號! 公眾號回復:
入群
,掃碼加入我們交流群!