retrofit中Interceptor拦截器的使用

一、使用Interceptor拦截器原因
  • 在实际开发中可能会遇上网络请求同时存在多个baseUrl的情况,或者测试环境和正式环境用的是不同的baseUrl。或者是在多个API接口中存在一些必须的统一参数;在开发过程中调试网络请求等。然后想起retrofit 有一个拦截器的配置。
二、Interceptor使用
1、自定义Interceptor实现Interceptor接口

自定义Interceptor拦截器需要实现Interceptor接口

public class MyBaseUrlInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        return null;
    }

}
2、查看Chain接口源码
interface Chain {
    Request request();

    Response proceed(Request request) throws IOException;

    /**
     * Returns the connection the request will be executed on. This is only available in the chains
     * of network interceptors; for application interceptors this is always null.
     */
    @Nullable Connection connection();

    Call call();

    int connectTimeoutMillis();

    Chain withConnectTimeout(int timeout, TimeUnit unit);

    int readTimeoutMillis();

    Chain withReadTimeout(int timeout, TimeUnit unit);

    int writeTimeoutMillis();

    Chain withWriteTimeout(int timeout, TimeUnit unit);
}

在这里就发现到这里可以拿到网络请求的Request、Response等对象

3、查看Request类源码


发现在这里就可以拿到网络请求的url和headers、RequestBody这些信息

4、拿到网络请求原先的url

那么在我们的自定义Interceptor中,我们就可以这样拿到网络请求原先的url:

Request request = chain.request();//获取原始的originalRequest

HttpUrl oldUrl = request.url();//获取原先的url
5、切换新的url

拿到原先的url后就可以根据业务需求来切换新的url:

HttpUrl newURL = null;
newURL = HttpUrl.parse(“新的url”);

HttpUrl newHttpUrl = oldUrl.newBuilder()//重建新的HttpUrl,需要重新设置的url部分
                    .scheme(newURL .scheme())//http协议如:http或者https
                    .host(newURL .host())//主机地址
                    .port(newURL .port())//端口
                    .build();

Request.Builder builder = request.newBuilder();//获取originalRequest的创建者builder
Request newRequest = builder.url(newHttpUrl).build();//获取处理后的新newRequest

return chain.proceed(newRequest);//返回新的Request 对象进行网络请求

这样就完成了一个自定义的Interceptor拦截器

6、完整的自定义Interceptor拦截器
public class BaseUrlInterceptor implements Interceptor {

    @Override
    public Response intercept(okhttp3.Interceptor.Chain chain) throws IOException {

        Request request = chain.request();//获取原始的originalRequest
        HttpUrl oldUrl = request.url();//获取老的url

        HttpUrl baseURL = HttpUrl.parse("https://api.apiopen.top");
        HttpUrl newHttpUrl = oldUrl.newBuilder()//重建新的HttpUrl,需要重新设置的url部分
            .scheme(baseURL.scheme())//http协议如:http或者https
            .host(baseURL.host())//主机地址
            .port(baseURL.port())//端口
            .build();

        Request.Builder builder = request.newBuilder();//获取originalRequest的创建者builder
        Request newRequest = builder.url(newHttpUrl).build();//获取处理后的新newRequest

        return chain.proceed(newRequest);
    }

}
7、使用自定义的Interceptor

可以在构造OkHttpClient实例时使用自定义的Interceptor:

OkHttpClient.Builder builder = new OkHttpClient.Builder()
    .addInterceptor(new MyCacheInterceptor(mContext))
OkHttpClient okHttpClient = builder.build();
三、其他:

因为在看源码的时候发现能拿到Request、Response对象,那么就想到了一些必须的统一参数应该也可以写一个Interceptor进行配置。于是来到HttpUrl类的源码查找,找到了这个addQueryParameter()方法。

那么添加公共参数的Interceptor 就可以这样实现:

Request request = chain.request();
HttpUrl httpUrl = request.url();//获取url

HttpUrl modifiedUrl = request.url().newBuilder()
    .addQueryParameter("appid", "010")
    .addQueryParameter("appkey", "1000")
    .build();

Request newRequest;
newRequest = request.newBuilder().url(modifiedUrl).build();

return chain.proceed(newRequest);

返回新的Request 对象去进行网络请求,这个新的Request 对象就写入了一些必须的公共参数。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 你可以使用OkHttp的Interceptor来拦截参数。在使用Retrofit时,可以通过自定义OkHttpClient并添加Interceptor来实现。以下是一个示例: ``` OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request requestWithNewParameter = originalRequest.newBuilder() .addHeader("Your-Header-Name", "Your-Header-Value") .build(); return chain.proceed(requestWithNewParameter); } }) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); YourApiService apiService = retrofit.create(YourApiService.class); ``` 在上面的示例,我们添加了一个Interceptor来拦截每个请求并添加一个自定义的Header。你可以根据需要修改拦截器的实现来拦截并修改请求参数。 ### 回答2: 在Android开发Retrofit是一个非常流行的网络请求库。它提供了拦截器Interceptor)的功能,可以对网络请求的参数进行拦截和修改。 拦截器是一个接口,可以在请求之前或者响应之后对请求进行处理。在Retrofit,可以通过实现Interceptor接口来自定义拦截器。 通过拦截器,我们可以对请求进行一些通用的处理,比如对请求头进行添加、修改、删除等操作。我们可以在拦截器的intercept方法获取到请求的参数,然后根据需求进行修改。 拦截器可以被添加到OkHttpClient的拦截器,通过addInterceptor()方法来添加。当发起网络请求时,拦截器会按照添加的顺序进行拦截。这样,我们就可以在请求添加或修改参数。 拦截器还可以对响应进行处理,比如对返回的数据进行解析、转换等操作。拦截器可以获取到响应的数据,然后可以对数据进行一些处理,并返回给调用方。 通过使用拦截器,我们可以在不修改原有的网络请求代码的情况下,对请求和响应进行一些通用的处理。这样可以提高开发的效率,并且可以保持代码的整洁和可维护性。 总的来说,Android Retrofit拦截器功能非常强大,可以非常方便地对网络请求的参数进行拦截和修改,提供了非常灵活的扩展性。 ### 回答3: 在AndroidRetrofit是一个广泛使用的网络请求库,用于方便地从服务器获取数据。拦截参数是指在使用Retrofit发送网络请求之前,可以通过拦截器对请求的参数进行修改或添加一些额外的信息。 在Retrofit,可以通过自定义拦截器来实现对参数的拦截操作。拦截器是一个接口,它提供了两个方法:intercept和proceed。 intercept方法用于处理拦截逻辑,我们可以在这个方法获取到请求的参数信息,并对其进行修改或添加额外信息。可以使用request.body()方法获取请求体,再通过request.newBuilder()方法创建一个新的请求,最后通过chain.proceed()方法继续请求的发送。 proceed方法表示继续发送原始请求,如果不调用该方法,请求将会被拦截,不会发送到服务器。 要使用拦截器,首先需要创建一个OkHttpClient对象,并通过addInterceptor方法将拦截器添加到OkHttpClient。然后将创建的OkHttpClient对象传递给Retrofit.Builder的client方法。 以下是一个示例代码,演示如何使用拦截器对请求参数进行拦截: ``` OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // 获取原始请求的参数 HttpUrl url = request.url().newBuilder() .addQueryParameter("key", "value") .build(); Request newRequest = request.newBuilder() .url(url) .build(); return chain.proceed(newRequest); } }); OkHttpClient client = builder.build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/") .client(client) .build(); ``` 上述代码创建了一个OkHttpClient对象,并添加了一个拦截器。在拦截器的intercept方法,获取了原始请求的参数,然后对其进行了修改(添加了一个名为key值为value的参数),最后调用chain.proceed方法继续发送请求。 通过拦截器,我们可以对请求的参数进行灵活处理,例如对请求进行签名、添加公共参数等操作,提高了开发的灵活性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值