public class OkHttpUtils { private static OkHttpUtils okHttpUtils; private Context context; private OkHttpClient okHttpClient; static String result = ""; private static Handler handler; public OkHttpUtils(Context context) { this.context = context; handler = new Handler(); initOK(); } /** * 创建ok */ private void initOK() { okHttpClient = new OkHttpClient.Builder() .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .addInterceptor(new MyIntercepter()) .readTimeout(10,TimeUnit.SECONDS) .writeTimeout(1000, TimeUnit.MILLISECONDS) .connectTimeout(5, TimeUnit.SECONDS).build(); } public static OkHttpUtils getInstance(Context context) { if (okHttpUtils == null) { synchronized (OkHttpUtils.class) { if (okHttpUtils == null) { okHttpUtils = new OkHttpUtils(context); } } } return okHttpUtils; } /** * get请求 * * @return */ public void getData(String url, final ICallback iCallback) { Request request = new Request.Builder() .url(url) .get().build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { } @Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { if (response.code() == 200) { result = response.body().string(); handler.post(new Runnable() { @Override public void run() { iCallback.getData(result); } }); } } } }); } /** * post请求:1原生表单 2.支持文件的,或者两个方式封装到一个方法里 * * @return */ public void post(String url, Map<String, String> params, final ICallback iCallback) { //1.FORM原生表单,<form></form>(单纯提交字符串类型的键值对)2.multipart/form-data(1.字符串类型键值对和文件) 3.raw(json、xml) 4.binary(文件流) //1.普通表单 //普通表单 FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> stringStringEntry : params.entrySet()) { builder.add(stringStringEntry.getKey(), stringStringEntry.getValue()); } Request request = new Request.Builder() .url(url) .post(builder.build()).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { } @Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { if (response.code() == 200) { result = response.body().string(); handler.post(new Runnable() { @Override public void run() { iCallback.getData(result); } }); } } } }); } //拦截器 class MyIntercepter implements Interceptor { //intercept 拦截 @Override public Response intercept(Chain chain) throws IOException { //添加公共参数 //post 取出原来所有的参数,将之加到新的请求体里面。然后让请求去执行 Request request = chain.request(); //获取请求方法 String method = request.method(); if (method.equals("GET")) {//---------------------------GET 拦截 //取出url地址 String url = request.url().toString(); //拼接公共参数 boolean contains = url.contains("?"); if (contains) { url = url + "&source=android"; } else { url = url + "?source=android"; } Request request1 = request.newBuilder().url(url).build(); Response response = chain.proceed(request1); return response; } else if (method.equals("POST")) {//---------------------POST 拦截 RequestBody body = request.body();//请求体 if (body instanceof FormBody) { //创建新的请求体 FormBody.Builder newBuilder = new FormBody.Builder(); for (int i = 0; i < ((FormBody) body).size(); i++) { String key = ((FormBody) body).name(i); String value = ((FormBody) body).value(i); newBuilder.add(key, value); } //添加公共参数 newBuilder.add("source", "android"); FormBody newBody = newBuilder.build(); //创建新的请求体 Request request1 = request.newBuilder().post(newBody).build(); //去请求 Response response = chain.proceed(request1); return response; } } return null; } } /** * post请求:2.支持文件的,或者两个方式封装到一个方法里 * * @return */ public void postFile(String url, Map<String, Object> params, final ICallback iCallback) { //1.FORM原生表单,<form></form>(单纯提交字符串类型的键值对)2.multipart/form-data(1.字符串类型键值对和文件) 3.raw(json、xml) 4.binary(文件流) //1.普通表单 //multipart/form-data MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); for (Map.Entry<String, Object> stringObjectEntry : params.entrySet()) { String key = stringObjectEntry.getKey(); Object value = stringObjectEntry.getValue(); if (value instanceof File) { File file = (File) value; builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("image/*"), file)); } else { builder.addFormDataPart(key, value.toString()); } } Request request = new Request.Builder() .url(url) .post(builder.build()).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { } @Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { if (response.code() == 200) { result = response.body().string(); handler.post(new Runnable() { @Override public void run() { iCallback.getData(result); } }); } } } }); } public interface ICallback { void getData(String result); } }
OkHttp的二次分装
最新推荐文章于 2021-05-25 21:49:11 发布