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();
希望它可以帮助别人。 🙂