首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除401和407之外的OKHttp身份验证器自定义http代码

除401和407之外的OKHttp身份验证器自定义http代码
EN

Stack Overflow用户
提问于 2017-03-24 16:06:29
回答 1查看 1.4K关注 0票数 3

我在服务器端实现了oauth令牌,但在无效令牌或令牌过期时,我得到了200Http状态码,但在响应体中,当我试图读取interceptor中的字符串时,我得到了{"code":"4XX", "data":{"some":"object"},因为response.body().string()只能被调用一次。

另外,我从这里读到Refreshing OAuth token using Retrofit without modifying all calls,我们可以使用OkHttp验证器类,但它只适用于401/407,我还没有尝试过,因为我不会得到这个。我们有没有办法定制Authenticator,并在其中继续我们的逻辑。谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-12-28 15:20:28

如果可能,尝试与您的服务器端讨论响应代码。沟通也是一项非常重要的技能。

如果不可能,您可以手动修改响应代码与反射,它启用okHttp身份验证逻辑。

代码语言:javascript
复制
public OkHttpClient getOkHttpClient() {
    return new OkHttpClient.Builder()
            .authenticator((route, response) -> {
                System.out.println("it working");
                return null;
            })
            .addNetworkInterceptor(new UnauthorizedCaseParserInterceptor())
            .build();
}


public class UnauthorizedCaseParserInterceptor implements Interceptor {

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        if (isUnauthorizedResponse(response)) {
            try {
                Field codeField = response.getClass().getDeclaredField("code");
                codeField.setAccessible(true);
                codeField.set(response, HttpURLConnection.HTTP_UNAUTHORIZED);
            } catch (Exception e) {
                return response;
            }
        }
        return response;
    }

    private boolean isUnauthorizedResponse(Response response) {
        //parse response...
    }
}

请仅在万不得已的情况下使用此解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42994353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档