Estou usando o OAuth e preciso colocar o token OAuth no meu cabeçalho sempre que faço uma solicitação. Eu vejo a @Header
anotação, mas existe uma maneira de parametrizá-la para que eu possa passar em tempo de execução?
Aqui está o conceito
@Header({Authorization:'OAuth {var}', api_version={var} })
Você pode passá-los em Runtime?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
java
android
annotations
retrofit
jpotts18
fonte
fonte
Respostas:
Além de usar o parâmetro @Header, prefiro usar RequestInterceptor para atualizar todas as suas solicitações sem alterar sua interface. Usando algo como:
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: Se você estiver usando Retrofit2, você deve usar em
Interceptor
vez deRequestInterceptor
Uma vez que
RequestInterceptor
não está mais disponível no Retrofit 2.0fonte
RestAdapter
depende do Retrofit1, no Retrofit2 éRetrofit
. Vou usar o Retrofit2, então não há problemas se usar oRequestInterceptor
código acima?Sim, você pode passá-los em tempo de execução. Na verdade, exatamente como você digitou. Isso estaria em sua classe de interface da API, chamada, digamos, SecretApiInterface.java
public interface SecretApiInterface { @GET("/secret_things") SecretThing.List getSecretThings(@Header("Authorization") String token) }
Em seguida, você passa os parâmetros de sua solicitação para essa interface, algo nesse sentido: (este arquivo seria, por exemplo, 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()); } }
Onde
Somehow.Magically.getToken()
está uma chamada de método que retorna um token, cabe a você onde e como defini-lo.É claro que você pode ter mais de uma
@Header("Blah") String blah
anotação na implementação da interface, como no seu caso!Também achei confuso, a documentação diz claramente que substitui o cabeçalho, mas NÃO !
Na verdade, é adicionado como uma
@Headers("hardcoded_string_of_liited_use")
anotaçãoEspero que isto ajude ;)
fonte
A resposta aceita é para uma versão mais antiga do Retrofit. Para futuros espectadores, a maneira de fazer isso com
Retrofit
2.0 é usando um cliente OkHttp personalizado: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();
Espero que ajude alguém. :)
fonte
Interceptor
para o qual pode definir ou redefinir o interceptor em um estágio posterior. No entanto, eu diria que ter o retrofit como um singleton pode ser um sinal de otimização inicial. Não há sobrecarga na criação de uma nova instância de retrofit: github.com/square/retrofit/blob/master/retrofit/src/main/java/…Interceptor
s depois de criar uma instância Retrofit2.Retrofit 2.3.0
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); okHttpClientBuilder .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder newRequest = request.newBuilder().header("Authorization", accessToken); return chain.proceed(newRequest.build()); } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl(GithubService.BASE_URL) .client(okHttpClientBuilder.build()) .addConverterFactory(GsonConverterFactory.create()) .build();
Estou usando isso para me conectar ao GitHub.
fonte