OKhttp的简单封装加拦截器
来源:互联网 发布:java.util详解 编辑:程序博客网 时间:2024/05/24 03:55
1.拦截器package com.example.utils;import android.util.Log;import java.io.IOException;import okhttp3.FormBody;import okhttp3.Interceptor;import okhttp3.Request;public class LogInterceptor implements Interceptor { public static String TAG = "LogInterceptor"; @Override public okhttp3.Response intercept(Chain chain) throws IOException { //有些服务器连接不能获取返回的数据需要加一个请求头 // Request request = chain.request().newBuilder().addHeader("User-Agent","OkHttp Example").build(); Request request = chain.request(); long startTime = System.currentTimeMillis(); okhttp3.Response response = chain.proceed(chain.request()); long endTime = System.currentTimeMillis(); long duration=endTime-startTime; okhttp3.MediaType mediaType = response.body().contentType(); String content = response.body().string(); Log.d(TAG,"\n"); Log.d(TAG,"----------Start----------------"); Log.d(TAG, "| "+request.toString()); String method=request.method(); if("POST".equals(method)){ StringBuilder sb = new StringBuilder(); if (request.body() instanceof FormBody) { FormBody body = (FormBody) request.body(); for (int i = 0; i < body.size(); i++) { sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ","); } sb.delete(sb.length() - 1, sb.length()); Log.d(TAG, "| RequestParams:{"+sb.toString()+"}"); } } Log.d(TAG, "| Response:" + content); Log.d(TAG,"----------End:"+duration+"毫秒----------"); return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build(); }}
2.okhttp封装及添加拦截器package com.example.utils;import com.google.gson.Gson;import com.google.gson.internal.$Gson$Types;import java.io.File;import java.io.IOException;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.MultipartBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class OkHttpManager { private final Gson gson; private volatile static OkHttpManager okHttpManager; private OkHttpClient okHttpClient; private Request request; private OkHttpManager(){ gson = new Gson(); } public static OkHttpManager getInstance(){ if (okHttpManager == null) { synchronized (OkHttpManager.class) { if (okHttpManager == null) { okHttpManager = new OkHttpManager(); } } } return okHttpManager; } private boolean setRequest=false; private boolean setOkHttpClient=false; public OkHttpManager setRequest(Request request) { this.request = request; setRequest=true; return this; } public OkHttpManager setOkHttpClient(OkHttpClient okHttpClient) { this.okHttpClient = okHttpClient; setOkHttpClient=true; return this; } public void requestAsyn(String url, Map<String,String> map, final ResultCallback mcallBack){ if (setRequest==false) { request = getRequest(url, map); } if (setOkHttpClient==false&&okHttpClient==null) { //添加拦截器 okHttpClient= new OkHttpClient.Builder().addInterceptor(new LogInterceptor()).build(); } okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { mcallBack.onFailure(call,e); } @Override public void onResponse(Call call, Response response) throws IOException { if (response!=null&&response.isSuccessful()) { String json = response.body().string(); mcallBack.onResponse(call, gson.fromJson(json, mcallBack.mType), json); } } }); if (setRequest){ request=null; setRequest=false; } if (setOkHttpClient) { okHttpClient = null; setOkHttpClient=false; } } public void UpLoadFile(String url, Map<String,Object> map, final ResultCallback mcallBack){ if (map==null||map.size()<1) throw new RuntimeException("上传头像必须用post方式,map集合不能为空"); MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) { String key = stringObjectEntry.getKey(); Object value = stringObjectEntry.getValue(); if (value instanceof File){//如果请求的值是文件 File file = (File) value; builder.addFormDataPart(key,((File) value).getName(), RequestBody.create(MediaType.parse("application/octet-stream"),file)); }else{//如果请求的值是string类型 builder.addFormDataPart(key,value.toString()); } } Request request = new Request.Builder().post(builder.build()).url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { mcallBack.onFailure(call,e); } @Override public void onResponse(Call call, Response response) throws IOException { if (response!=null&&response.isSuccessful()) { String json = response.body().string(); mcallBack.onResponse(call, gson.fromJson(json, mcallBack.mType), json); } } }); } private Request getRequest(String url, Map<String, String> map) { Request request; if (map==null||map.size()==0){ request =new Request.Builder().get().url(url).build(); } else { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> stringStringEntry : map.entrySet()) { builder.add(stringStringEntry.getKey(),stringStringEntry.getValue()); } FormBody build = builder.build(); request =new Request.Builder().post(build).url(url).build(); } return request; } public static abstract class ResultCallback<T> { Type mType; public ResultCallback() { mType = getSuperclassTypeParameter(getClass()); } static Type getSuperclassTypeParameter(Class<?> subclass) { //通过反射得到泛型参数 //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。 Type superclass = subclass.getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } //ParameterizedType参数化类型,即泛型 ParameterizedType parameterized = (ParameterizedType) superclass; //getActualTypeArguments获取参数化类型的数组,泛型可能有多个 //将Java 中的Type实现,转化为自己内部的数据实现,得到gson解析需要的泛型 return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); } public abstract void onFailure(Call call, IOException e); public abstract void onResponse(Call call,T response,String json); }}
阅读全文
0 0
- OKhttp的简单封装加拦截器
- Okhttp简单封装加网络拦截器
- OkHTTP二次封装加拦截器
- 封装okhttp--拦截器
- okHttp的封装和拦截器
- 带拦截器的okhttp封装类
- OkHttp框架加拦截器
- OkHttp封装+网络拦截器
- 拦截器+OkHttp封装 Recyclerview
- okhttp的简单封装
- OkHttp的简单封装
- okhttp的简单封装
- 简单的封装okhttp
- OKHTTP的简单封装
- okhttp的简单封装
- 简单的okhttp封装
- 简单的封装Okhttp
- 简单的封装okhttp
- LeetCode--Roman to Integer
- 2级购物车
- 二维火Android云收银模块化实践
- Java中动态加载jar文件和class文件
- 剑指offer 49 不用加减乘除做加法
- OKhttp的简单封装加拦截器
- LaTex(PART XVII)布局相关(II)页面相关参数
- Linux——如何安装WPS
- java常用类库---NumberFormat类
- win10下使用scrapy报错No module named 'win32api'
- 【bzoj2393】【Cirno的完美算数教室】容斥原理的剪枝应用
- 控件从左上角移动到右下角
- Android RecyclerView的下拉加载更多
- 51nod 1202 dp