OkHttp添加基本身份验证标头

时间:2020-05-13 16:31:45

标签: android okhttp

我想向使用OkHttp3完成的请求中添加基本身份验证标头。

这是我的代码:

        // Adding Authentication Header
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                String credential = Credentials.basic(username, password);
                return response.request().newBuilder().header("Authorization", credential).build();
            }
        });

        // 
        client.connectTimeout(10, TimeUnit.SECONDS);
        client.writeTimeout(10, TimeUnit.SECONDS);
        client.readTimeout(10, TimeUnit.MINUTES);

        RequestBody body = RequestBody.create(null, new byte[]{});
        if( json != null) {
            body = RequestBody.create(MediaType.parse(
                    "application/json"),
                    json.toString()
            );
        }

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        client.build().newCall(request).enqueue(callback);

很遗憾,没有添加Authentication标头,我真的找不到错误。

2 个答案:

答案 0 :(得分:5)

Authenticator主要用于“反应式”身份验证,即并非每次自动调用。自动调用的主要方案是401“未经授权”服务器响应。

您可能应该使用常规的Interceptor来代替,只需使用client构建器进行注册即可,如下所示:

client.addInterceptor(
   object : Interceptor { chain ->
       val request = chain.request().newBuilder()
            .addHeader(...)
            .build()
       return chain.proceed(request)
   }
)

答案 1 :(得分:1)

为此,您需要使用OkHttp Builder提供的拦截器。顾名思义,拦截器可以拦截并通过客户端发送的请求或客户端收到的任何响应,然后再将它们传递到您的应用程序。

在您的情况下,您需要通过拦截请求并在离开客户之前向其附加新的标头来添加此自定义拦截器。

向每个请求添加自定义标头

return OkHttpClient.Builder()
    .addInterceptor { chain ->
        var request = chain.request()
        var url = request.url()


        request = request.newBuilder()
            .removeHeader("needAuthToken")
            .addHeader("Content-Type", "application/json")
            // Feel free to add any other headers
            .url(url)
            .build()

        chain.proceed(request)
}

随时将其包装在任何控制流条件下,以防这些标头的附加在谓词上很重要。