Retrofit2.0结合okhttp3来使用拦截器给GET或者Post请求添加固定参数(详细步骤)

1:首先使用OkHttpClient新建一个builder.(这里面的connect、writer、read如果只是测试可以不添加)

       OkHttpClient.Builder U1builder = new OkHttpClient().newBuilder();
        U1builder .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .addInterceptor(new CustomQuery());

注意最后一行的addInterceptor就是我们自定义的拦截器了。

2: CustomQuery这个拦截器的详细代码如下:

public class CustomQuery implements Interceptor {
	@Override
	public Response intercept(Chain chain) throws IOException {
		Request request = chain.request();
		request = new GetRequest(request).getRequest(request);
		return chain.proceed(request);
	}
}

3:其中GetRequest是自定义的一个类,这里是GET请求,我们也可以新建一个POST请求的自定义类。


class GetRequest implements IRequestParam {
	
	@Override
	public Request getRequest(Request request) {
		//添加公共参数
		HttpUrl modifiedUrl = request.url().newBuilder()
				.addQueryParameter("client","8002004342510669")
				.addQueryParameter("account","760018592752" )
				.addQueryParameter("type","resultType=json" )
				.build();

		return request.newBuilder().url(modifiedUrl).build();
	}
}

4:其中IRequestParam就是一个简单的接口,其代码如下:(Request都是OKhttp3中的request)

public interface IRequestParam {
	Request getRequest(Request request);
}

5: 我们也可以把第二步中的GetRequest这个类换成PostRequest,PostRequest这个类的详细代码如下:(其中FormBody也是OKhttp3这个包里面的类)

public class PostRequest implements IRequestParam{
	public PostRequest() {
	}

	@Override
	public Request getRequest(Request request) {
		if (request.body() instanceof FormBody) {
			FormBody.Builder  builder = new FormBody.Builder();
			FormBody formBody = (FormBody) request.body();
			for (int i = 0; i < formBody.size(); i++) {
				builder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
			}
			formBody = builder.addEncoded("client", "8002004342510669")
					.addEncoded("account", "760018592752")
					.addEncoded("resultType", "resultType=json")
					.build();
			request = request.newBuilder().post(formBody).build();
		}
		return request;
	}
}

6:拦截器已经写好了,我们直接将第一步中的这个builder添加到Retrofit后面就可以了,在链式调用后面再点出来一个Client.代码如下:

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(JsonOrXmlConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(U1builder.build())
                .build();

7: 然后发送一个请求抓包查看一下结果,看看第三步中的client、account、type参数是否已经添加进去,如图:

可以看到GET请求的三个固定参数已经添加进去了,我这边只加了一个ptype参数。post请求就可以依葫芦画瓢,将第二步的GetRequest换成PostRequest即可。

猜你喜欢

转载自blog.csdn.net/Chen_dSir/article/details/103969302
今日推荐