我正在为我们的项目(具有微服务架构的基于Java的服务器端应用程序,微服务通过HTTP进行交互)评估Retrofit 2,并且很难理解以下内容:
Documentation of OkHttpClient指出,最好对所有HTTP调用共享OkHttpClient实例,因此我得出结论,它应该是微服务中的单例对象(例如,具有作用域Singleton的spring bean)。
当我生成改造后的代理时,我使用以下代码:
Retrofit.Builder builder = new Retrofit.Builder();
Retrofit retrofit = builder
.baseUrl(baseUrl)
.client(okHttpClient) // reusing the same http client instance
.build();
retrofit.create(<class_of_my_interface_goes_here>);
到目前为止很好,但是现在我想向将在我的接口的代理上执行的调用中添加一些自定义标头。
例如,假设我有两个接口:
interface RequiresAuthToken {
@GET(...)
Call<...> doSomething();
}
interface NoAuthTokenRequired {
@GET(...)
Call<...> doSomethingElse();
}
对于第一个接口调用-我想传递一个授权标题,但是对于第二个服务调用-我不需要此功能
当然,一个显而易见的解决方案是将令牌添加到参数中,但是我真的不想为每个服务都这样做,因为它是一个基础级的东西。
授权标头仅是一个示例,其他示例可以是为执行请求的当前客户端标识符添加标头,为多租户环境设置添加租户ID,等等。
到目前为止,在我发现的所有文档中,建议使用ok http客户端拦截器,但是在创建ok http客户端时添加(单个实例)
new OkHttpClient.Builder()
.addInteceptor(...)
.build();
所以我的问题是如何在呼叫级别添加拦截器?
我想在基础设施改造级别上做到这一点,而不是更改应用代码中的调用