作为Android端最主流的联网框架,OkHttp已经被很多人在很多项目中使用,可能大多数人都是会把OkHttp依赖加进去,然后初始化后再用retrofit来访问接口,但是在开发过程中,如果做对应语言消息返回的时候 比如手机是中文,服务端返回数据的提示就是中文,如果手机是英文,那么服务端返回数据的提示是英文,所以在这个地方,就需要在请求接口的时候,给服务端传递一个语言参数,然后服务端就会根据这个传过去的语言参数来返回不同语言的提示,好,我们现在要解决的就是传递语言参数的问题。
我之前在不知道OkHttp可以统一添加请求参数的时候,我是给每个接口都传递了一个语言参数,其实吧这样的也可以,再其实吧,不传也可以,因为服务端都会设置一个默认的返回提示,或者默认英文,或者默认中文的,但是后来接手了一个项目,这个项目也需要传递语言参数,但是我一看我的前辈写的接口,大概一百多接口,都没加这个参数,但是新需求上又需要传递这个,我不可能一个一个接口的加吧,那么多,然后在百度上面找,就看到了OkHttp的这个,可以在初始化的时候给所有接口添加一个请求参数,下面是初始化OkHttp的代码,都通用的,就这个几句,但是要给接口添加参数是写注释这一句:
com.squareup.okhttp.OkHttpClient okHttpClient = new com.squareup.okhttp.OkHttpClient().setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return false; } }).setCache(new Cache(Util.getCacheDir(), 1 * 1024 * 1024)) .setSslSocketFactory((SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(1000)); okHttpClient.interceptors(). add(new LoggingInterceptor());//这一句是给接口添加参数的,但是主要的还是new LoggingInterceptor() RestAdapter mRestAdapter = new RestAdapter.Builder().setEndpoint(url). setConverter(new GsonConverter(gson)).setLogLevel(RestAdapter.LogLevel.FULL) .setLog(new RestAdapter.Log() { @Override public void log(String s) { } }).setClient(new OkClient(okHttpClient)).build();
上面写注释那一句就是添加一个方法,这个方法是我们自己写的:
public class LoggingInterceptor implements Interceptor { private final Charset UTF8 = Charset.forName("UTF-8"); @Override public Response intercept(Chain chain) throws IOException { Request oldRequest = chain.request();//定义一个Request 请求 // 添加新的参数 HttpUrl.Builder authorizedUrlBuilder = oldRequest.httpUrl().newBuilder().scheme(oldRequest.httpUrl().scheme()) .host(oldRequest.httpUrl().host()) .addQueryParameter("字段名字", "语言");//在这个请求里面添加一个请求参数 // 新的请求 Request newRequest = oldRequest.newBuilder() .method(oldRequest.method(), oldRequest.body()) .url(authorizedUrlBuilder.build()) .build();//再定义一个新的Request请求,再把添加了请求参数的请求放到新的请求里面来请求数据 RequestBody requestBody = newRequest.body(); String body = null; if (requestBody != null) { Buffer buffer = new Buffer(); requestBody.writeTo(buffer); Charset charset = UTF8; MediaType contentType = requestBody.contentType(); if (contentType != null) { charset = contentType.charset(UTF8); } body = buffer.readString(charset); } long startNs = System.nanoTime(); Response response = chain.proceed(newRequest); long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); ResponseBody responseBody = response.body(); String rBody = null; return response; } }
首先在这个方法里面,我们需要定义一个Request 请求,但是这个请求不是执行请求数据,而是在这个请求里面添加一个请求参数,然后再定义一个新的Request请求,再把添加了请求参数的请求放到新的请求里面来请求数据,这样所以通过这个方法请求的接口都会带一个你添加的参数。
注:这个方法是我自己百度到的,属于个人理解,说的不对的地方,欢迎大神指点。