我正在尝试使用Retrofit2,我想添加Token到我的Header喜欢这个:
Authorization: Bearer Token
但code下面不起作用:
public interface APIService {
@Headers({"Authorization", "Bearer "+ token})
@GET("api/Profiles/GetProfile?id={id}")
Call<UserProfile> getUser(@Path("id") String id);
}
Run Code Online (Sandbox Code Playgroud)
我的服务器asp.net webApi
请帮忙我该怎么办?
我使用Retrofit 2.0与Jackson转换器与REST API通信.某些请求需要授权令牌.如果我拥有的令牌已过期,我需要用另一个请求刷新它们并重复上次因此而失败的请求.
我的问题:我每次都需要手动完成它还是有任何方法可以自动化它?
这是我现在实现它的方式:
TrackerService
public interface TrackerService {
@POST("auth/sendPassword")
Call<ResponseMessage> sendPassword(@Header("app-type") String appType,
@Body User userMobile);
@FormUrlEncoded
@POST("oauth/token")
Call<TokenResponse> oathToken(@Field("client_id") String clientId,
@Field("client_secret") String clientSecret,
@Field("grant_type") String grantType,
@Field("username") String username,
@Field("password") String password);
@FormUrlEncoded
@POST("oauth/token")
Call<TokenResponse> refreshToken(@Field("client_id") String clientId,
@Field("client_secret") String clientSecret,
@Field("grant_type") String grantType,
@Field("refresh_token") String username);
@PUT("me/profile")
Call<Profile> updateProfile(@Header("app-type") String appType,
@Header("Authorization") String token,
@Body Profile profile);
}
Run Code Online (Sandbox Code Playgroud)
ServiceGateway
public class ServiceGateway {
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private …Run Code Online (Sandbox Code Playgroud) 嘿,我正在使用Dagger2,Retrofit而且OkHttp我正面临依赖循环问题.
提供时OkHttp:
@Provides
@ApplicationScope
OkHttpClient provideOkHttpClient(TokenAuthenticator auth,Dispatcher dispatcher){
return new OkHttpClient.Builder()
.connectTimeout(Constants.CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(Constants.READ_TIMEOUT,TimeUnit.SECONDS)
.writeTimeout(Constants.WRITE_TIMEOUT,TimeUnit.SECONDS)
.authenticator(auth)
.dispatcher(dispatcher)
.build();
}
Run Code Online (Sandbox Code Playgroud)
提供时Retrofit:
@Provides
@ApplicationScope
Retrofit provideRetrofit(Resources resources,Gson gson, OkHttpClient okHttpClient){
return new Retrofit.Builder()
.baseUrl(resources.getString(R.string.base_api_url))
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
Run Code Online (Sandbox Code Playgroud)
提供时APIService:
@Provides
@ApplicationScope
APIService provideAPI(Retrofit retrofit) {
return retrofit.create(APIService.class);
}
Run Code Online (Sandbox Code Playgroud)
我的APIService界面:
public interface APIService {
@FormUrlEncoded
@POST("token")
Observable<Response<UserTokenResponse>> refreshUserToken();
--- other methods like login, register ---
}
Run Code Online (Sandbox Code Playgroud)
我的TokenAuthenticator …
我有两个班,Foo<T>和Bar,这是互相依赖的,以及各种其他类.我使用Dagger-2进行依赖注入,但如果我天真地添加循环依赖,Dagger会在运行时遇到堆栈溢出.什么是重构类来解决这个问题的好方法,同时仍然使用Dagger注入所有其他依赖项,并且对现有调用的重复和更改最少?
我知道改造会自动重试故障,但我想检查一个特定的错误.如果错误是由某个HTTP代码引起的,我需要在修改它之后重试该请求.
这可以使用同步调用轻松完成,但我正在进行异步调用(通过传递回调).当我在回调中得到错误时,我想重试请求 - 但我只有RetrofitError对象(我丢失了请求体).
我有多个请求从同一个活动(同时)进行,所以我避免保存所有请求并在成功时使它们无效.
有没有更好的方法来达到这个要求?
在我的应用程序中,我实现了Retrofit来调用WebServices,我使用OkHttp来使用Interceptor和Authenticator.有些请求需要令牌,我已经实现了Authenticator接口来处理刷新(遵循官方文档).但我有以下问题:在我的应用程序中不时,我必须立即调用多个请求.因此,对于其中一个我将有401错误.
这是我的请求调用代码:
public static <S> S createServiceAuthentication(Class<S> serviceClass, boolean hasPagination) {
final String jwt = JWT.getJWTValue(); //Get jwt value from Realm
if (hasPagination) {
Gson gson = new GsonBuilder().
registerTypeAdapter(Pagination.class, new PaginationTypeAdapter()).create();
builder =
new Retrofit.Builder()
.baseUrl(APIConstant.API_URL)
.addConverterFactory(GsonConverterFactory.create(gson));
}
OkHttpClient.Builder httpClient =
new OkHttpClient.Builder();
httpClient.addInterceptor(new AuthenticationInterceptor(jwt));
httpClient.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
if (responseCount(response) >= 2) {
// If both the original call and the call with refreshed token …Run Code Online (Sandbox Code Playgroud) 以下是我要处理的情况,
这应该对调用Activity,Fragment等是透明的.从调用者的角度来看,它是一个请求和一个响应.
我在直接使用OkHttpClient之前已经实现了这个流程,但我不知道如何在Retrofit中实现这一点.
也许与这个关于ResponseInterceptor的公开问题相关的东西?
如果在改造中没有直接的方法来实现这一目标,那么实施它的最佳方法是什么?基础监听器类?
我也在使用RoboSpice和Retrofit,如果它在这种情况下有用的话.
我正在尝试使用Retrofit(2.0.0-beta3),但是当使用Authenticator添加令牌时,我似乎无法从同步调用中获取数据.我们在后端的日志记录只显示了很多登录尝试,但我无法从正文中获取实际添加到标题的数据.
public static class TokenAuthenticator implements Authenticator {
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Refresh your access_token using a synchronous api request
UserService userService = createService(UserService.class);
Call<Session> call = userService.emailLogin(new Credentials("handle", "pass"));
// This call is made correctly, as it shows up on the back-end.
Session body = call.execute().body();
// This line is never hit.
Logger.d("Session token: " + body.token);
// Add new header to rejected request and retry it
return response.request().newBuilder()
.header("Auth-Token", body.token)
.build(); …Run Code Online (Sandbox Code Playgroud) 我是 android 编程和 Retrofit 的新手,我正在制作一个示例应用程序,我必须使用访问令牌进行两个并行网络调用。当访问令牌过期并返回 401 状态代码时,问题就会出现,如果我看到 401 HTTP 状态代码,我必须使用此访问令牌调用刷新令牌,但并行调用的问题是,它会导致刷新令牌的竞争条件刷新令牌,是否有任何最佳实践方法可以避免这种情况以及如何在没有任何冲突的情况下智能刷新令牌。
我在eclipse的android应用程序中使用OkHttp 2.0.0 jar.由于OkHttp现在依赖于Okio库,我还在我的项目中添加了Okio 1.0.0 jar.项目编译良好,没有编译错误,但是当我在我的Android设备上运行时,它给了我NoClassDefFoundError所有与OkHttp库类相关的内容.
我已将所有jar放在项目的libs文件夹中,并将它们添加到我的构建路径中,并尝试在"导出和顺序"选项卡中检查它们,但仍然无法正常工作.
我想知道,因为okhttp依赖于okio,只是添加两个罐子都可以正常工作或者我必须做任何不同的事情.
我也尝试过排球罐,它没有任何问题都可以正常工作.任何人都可以帮助我,这个问题现在已经存在了3到4天.
更新 我也尝试了android studio并在构建依赖中添加了okhttp库但仍然无法正常工作.