Feign 支持請求攔截器,在發送請求前,可以對發送的模板進行操作,例如設置請求頭等屬性,自定請求攔截器需要實現 feign.RequestInterceptor 接口,該接口的方法 apply 有參數 template ,該參數類型為 RequestTemplate,我們可以根據實際情況對請求信息進行調整,示例如下:
-
創建攔截器
創建自定義請求攔截器,在發送請求前增加了一個請求頭信息,進行身份校驗。
package org.lixue.feignclient;
import feign.RequestInterceptor;
import feign.RequestTemplate;
public class MyRequestInterceptor implements RequestInterceptor{
public void apply(RequestTemplatetemplate){
template.header("Authorization","lixue:123456");
}
}
-
附加攔截器
在使用時,如果需要附加攔截器和附加編碼器、解碼器的操作類似,示例如下:
HelloWorldClientspeakClient=
Feign.builder().requestInterceptor(new MyRequestInterceptor())
.target(HelloWorldClient.class,"http://localhost:8080/");
-
測試驗證
在默認情況下,不會記錄接口的日志,如果需要了解接口的調用情況,可以使用 logLevel 方法進行配置日志級別:
- NONE:默認值,不進行日志記錄
- BASIC:記錄請求方法、URL、響應狀態代碼和執行時間
- HEADERS:除了 BASIC 記錄的信息外,還包括請求頭和響應頭
- FULL:記錄全部日志,包括請求頭、請求體、請求與響應的元數據
配置日志級別為 FULL,我們測試驗證攔截器是否生效,代碼如下:
public class Startup{
public static void main(String[]args){
HelloWorldClientspeakClient=
Feign.builder().client(new MyClient())
.logLevel(Logger.Level.FULL)
.logger(new Logger.JavaLogger().appendToFile("E:\\Temp\\logs\\speak.log"))
.requestInterceptor(new MyRequestInterceptor())
.target(HelloWorldClient.class,"http://localhost:8080/");
System.out.println(speakClient.speak("isbody"));
}
}
啟動項目,然后查看日志如下:
[HelloWorldClient#speak] ---> GET http://localhost:8080/speak?body=is+body HTTP/1.1
[HelloWorldClient#speak] Authorization: lixue:123456
[HelloWorldClient#speak] ---> END HTTP (0-byte body)
[HelloWorldClient#speak] <--- HTTP/1.1 200 (790ms)
[HelloWorldClient#speak] content-length: 23
[HelloWorldClient#speak] content-type: text/plain;charset=UTF-8
[HelloWorldClient#speak] date: Thu, 05 Apr 2018 11:40:27 GMT
[HelloWorldClient#speak] x-application-context: helloworld-provider:8080
[HelloWorldClient#speak]
[HelloWorldClient#speak] speak is body port:8080
[HelloWorldClient#speak] <--- END HTTP (23-byte body)
在請求頭中,已經增加了 Authorization: lixue:123456 數據