【问题标题】:Retrofit2 put token in URL with placeholderRetrofit2 将令牌放入带有占位符的 URL
【发布时间】:2018-07-06 11:08:29
【问题描述】:

我在将 url 中的占位符替换为 auth-token 时遇到问题。

我的 OkHttpClient:

OkHttpClient clientToken = new OkHttpClient.Builder()
            .addInterceptor(tokenInterceptor)
            .addInterceptor(interceptor)
            .connectTimeout(100, TimeUnit.SECONDS)
            .readTimeout(100, TimeUnit.SECONDS)
            .build();

我的 TockenInspector:

private class TokenInterceptor implements Interceptor{

    @Override
    public Response intercept(Chain chain) throws IOException {
        Response mainResponse = chain.proceed(chain.request());
        //Auth Data available?
        if(RestClient.this.isAuthenticationDataSet()){
            //Get Token
            String currentToken = getToken(RestClient.this.authCustomerNumber,
                    RestClient.this.authUser,
                    RestClient.this.authPassword,
                    RestClient.this.authDeviceId);

            //Original RequestData
            Request originalRequest = chain.request();
            HttpUrl originalUrl = originalRequest.url();
            List<String> urlSegments = originalUrl.pathSegments();

            //New URL
            boolean tokenFoundInSegments = false;
            HttpUrl.Builder newUrlBuilder = originalUrl.newBuilder();

            //Search token placeholders in url segments
            for(int i=0; i<urlSegments.size(); i++){
                String segment = urlSegments.get(i);

                if(segment.equals(tokenPlaceholder)){
                    segment = currentToken;
                    tokenFoundInSegments = true;
                }

                newUrlBuilder.setPathSegment(i, segment);
            }

            //If not found in segments: Set token as get param
            if(!tokenFoundInSegments){
                newUrlBuilder.addQueryParameter("token", currentToken);
            }

            HttpUrl url = newUrlBuilder.build();
            Request tokenRequest = originalRequest.newBuilder().url(url).build();

            return chain.proceed(tokenRequest);
        }else{
            //No auth data available
            return chain.proceed(chain.request());
        }
    }
}

我的电话:

ObservableField<UserLoginData> userdata = 
UserBackend.getInstance(context).getUserLoginData();
//order the basket
Call<RestResult<BasketResult>> call = 
this.restAPIBasket.orderBasket(basket.getId(), userdata.get().getPassword());

call.enqueue(new Callback<RestResult<BasketResult>>() {
.....

网址: URL/R_token/password?format=json

我的问题:

当我调试时,retrofit 会在不设置令牌的情况下执行调用,然后它会通过 tokenInterceptor 类并再次进行调用。 谁能帮我解决这个问题? 我不能总是将令牌用作查询,但在某些 URL 中只能用作路径

【问题讨论】:

    标签: android retrofit2


    【解决方案1】:

    问题是:Response mainResponse = chain.proceed(chain.request());

    chain.proceed() 在没有设置令牌的情况下进行调用,并在设置令牌的情况下返回。也叫了两次。我删除了第一个,它工作正常

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2015-12-24
      • 2014-10-14
      • 2018-11-03
      • 2014-12-25
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2022-07-27
      相关资源
      最近更新 更多