如何在改型(Android)中动态设置标题

我使用的API使用授权方案,需要设置一个特殊的“X-authorization”头来验证请求。例如,此改装设置非常适合身份验证令牌为abc123的用户:

@标题(“X-授权:abc123”)
@获取(“/posts”)
可观察<列表<邮政&gt&燃气轮机;获取帖子();

我缓存了用户的X-Authorization令牌,因此我可以访问该令牌,但是,我不能将其放在@Headers声明中

@标题(“X-授权:+令牌)
@获取(“/posts”)
可观察<列表<邮政&gt&燃气轮机;获取帖子();

我在这里得到一个编译错误:错误:(41,34)错误:元素值必须是一个常量表达式

你有什么想法可以让我绕开这件事吗

自从改型2.0以来,您有两个选择


1) 使用OKHTTP2.2+使用拦截器

在Http级别,您对请求有更多的控制权,因此您可以做一些事情,例如仅将头应用于向特定端点发出的特定请求,等等

公共类myokhtpinterceptor实现拦截器{
@凌驾
公共响应拦截(链)引发IOException{
Request originalRequest=chain.Request();
如果(!“/posts.contains(originalRequest.url())){
返回链。继续(原始请求);
}
字符串令牌=//获取令牌逻辑
Request newRequest=originalRequest.newBuilder()
.header(“X-授权”,令牌)
.build();
返回链。继续(新请求);
}
[...]
OkHttpClient OkHttpClient=新的OkHttpClient();
okHttpClient.networkInterceptors().add(新的myokhttppinterceptor());
OkClient OkClient=新的OkClient(okHttpClient);
YourApi=new RestAdapter.Builder()
.setEndpoint(url)
.setClient(okClient)
.build()
.create(YourApi.class);

编辑
添加@JakeWarthon comment作为另一个选项也是有效的

2) 将@Header放在方法参数上,并在调用时将其作为值传递

来自文档:

//将标头替换为其目标的值。
@获取(“/”)
void foo(@Header(“Accept Language”)字符串lang,Callback<Response>cb);

标头参数可能为null,这将从请求中忽略它们。传递列表或数组将为每个非null项生成标头

注意:标题不会相互覆盖。请求中将包含所有同名的标题


编辑:此选项不应视为改装2。*已放弃对拦截器的支持

3)用户改装请求拦截器

从文档中:
在执行每个请求之前拦截请求,以便添加额外数据。

你可以这样做

公共类MyInterceptor实现RequestInterceptor{
@凌驾
公共无效截获(请求外观请求){
字符串令牌=//获取令牌逻辑
if(令牌!=null){
请求addHeader(“X-授权”,令牌);
}
}
[...]
YourApi=new RestAdapter.Builder()
.setEndpoint(url)
.setRequestInterceptor(新的myInterceptor())
.build()
.create(YourApi.class);

这种方法的“问题”是拦截器将在所有端点上执行,因为它是在RestAdapter级别设置的,而不是每个端点。此外,RequestFacade没有公开关于请求的很多信息,因此没有机会在其周围添加太多逻辑

发表评论