Android Retrofit参数化的@Headers

我正在使用OAuth,每次发出请求时都需要将OAuth令牌放入我的头文件中。 我看到@Header注释,但有没有办法让它参数化,所以我可以在运行时传入?

这是概念

@Header({Authorization:'OAuth {var}', api_version={var} })

你可以在运行时传递他们吗?

 @GET("/users") void getUsers( @Header("Authorization") String auth, @Header("X-Api-Version") String version, Callback<User> callback ) 

除了使用@Header参数,我宁愿使用RequestInterceptor更新所有的请求,而不改变你的接口。 使用类似于:

 RestAdapter.Builder builder = new RestAdapter.Builder() .setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Accept", "application/json;versions=1"); if (isUserLoggedIn()) { request.addHeader("Authorization", getToken()); } } }); 

p / s:如果你使用的是Retrofit2,你应该注意到Interceptor而不是RequestInterceptor

由于RequestInterceptor在Retrofit 2.0中不再可用

是的,你可以在运行时传递它们。 事实上,就像你input的一样。 这将在您的API接口类中,名为SecretApiInterface.java

 public interface SecretApiInterface { @GET("/secret_things") SecretThing.List getSecretThings(@Header("Authorization") String token) } 

然后你从你的请求中传递参数到这个接口,这些东西包括:(这个文件将是例如SecretThingRequest.java

 public class SecretThingRequest extends RetrofitSpiceRequest<SecretThing.List, SecretApiInteface>{ private String token; public SecretThingRequest(String token) { super(SecretThing.List.class, SecretApiInterface.class); this.token = token; } @Override public SecretThing.List loadDataFromNetwork() { SecretApiInterface service = getService(); return service.getSecretThings(Somehow.Magically.getToken()); } } 

在哪里Somehow.Magically.getToken()是一个方法调用,返回一个标记,这取决于你在哪里以及如何定义它。

你当然可以在接口实现中有多个@Header("Blah") String blah注解,就像你的情况一样!

我发现它也令人困惑, 文档清楚地说它取代了标题,但它不是
它实际上是和@Headers("hardcoded_string_of_liited_use")注解一样添加的

希望这可以帮助 ;)

被接受的答案是旧版本的Retrofit。 对于未来的用户,使用Retrofit 2.0的方法是使用自定义的OkHttp客户端:

 OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Builder ongoing = chain.request().newBuilder(); ongoing.addHeader("Accept", "application/json;versions=1"); if (isUserLoggedIn()) { ongoing.addHeader("Authorization", getToken()); } return chain.proceed(ongoing.build()); } }) .build(); Retrofit retrofit = new Retrofit.Builder() // ... extra config .client(httpClient) .build(); 

希望它可以帮助别人。 🙂