OkHttp的封装(参数全部使用Json提交)
来源:互联网 发布:美丽说软件下载 编辑:程序博客网 时间:2024/05/19 00:10
OkHttp相信都不陌生了,Android一个很好用的网络请求框架,GitHub上面2w多个Start,Square公司出品,也是JakeWharton大神的代表作之一(JakeWharton大神已离开Square公司加入Google),此处膜拜大神三秒钟……
我自己根据项目需要二次封装了OkHttp,因为和后台哥们商量的是,所有的参数全部转为Json传给服务器。上传图片时,把图片转换成Base64字符串,同样以Json的格式上传到服务器。
这是我用到的第三方依赖:
compile 'com.squareup.okhttp3:okhttp:3.8.1' //OkHttp的依赖,可能不是最新版本,可以去GitHub找最新的OkHttp依赖 compile 'id.zelory:compressor:2.0.0' //图片压缩,压缩效率和速度都不错
首先,创建一个OkHttp的单例类。在使用OkHttp时,最好保证全局只有一个OkHttpClient对象,这样方便管理和配置整个应用的网络请求的超时时间、缓存等等。如果有某个特殊的网络请求需要我们特别处理,我们也可以clone一个OkHttpClient对象单独处理。
public class OkHttpClientInstance { public static OkHttpClient instance; private OkHttpClientInstance() {} public static OkHttpClient getInstance() { if (instance == null) { synchronized (OkHttpClientInstance.class) { if (instance == null) { //配置了网络请求的超时时间 instance = new OkHttpClient().newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); } } } return instance; }}
创建网络请求类Network
public class Network { //上下文 private Context mContext; //请求的url private String mUrl; //通过单例类得到的OkHttpClient 对象 private OkHttpClient mClient; //解析服务器返回数据的Gson private Gson mGson; private Handler mHandler; //登录之后返回的Token字符串 private String mToken; public Network(Context context, String url) { this.mContext = context; this.mUrl = url; mClient = OkHttpClientInstance.getInstance(); mGson = new Gson(); mHandler = new Handler(); //获取Token的方式可以在进入程序时获取,存为全局变量 mToken = SPUtil.getString(context, SPUtil.LOGIN_TOKEN, ""); } /** * 执行普通的post请求,参数集合全部转为json * * @param map 传入的参数集合 * @param netCallBack 回调接口 */ public void performPost(Map<Object, Object> map, final NetCallBack netCallBack) { String params = mGson.toJson(map); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON, params); final Request request = new Request.Builder() .url(mUrl) .addHeader("Authorization", "Bearer" + mToken) .post(body) .build(); mClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { doFailure(netCallBack); } @Override public void onResponse(Call call, final Response response) throws IOException { doResponse(response, netCallBack); } }); } /** * post上传图片,全部转为json上传 * * @param params 参数集合 * @param picturePathList 图片的路径集合 * @param netCallBack 回调接口 */ public void upLoadPicture(Map<Object, Object> params, List<String> picturePathList, final NetCallBack netCallBack) { List<PictureFileBean> fileList = new ArrayList<>(); //处理图片 for (int i = 0; i < picturePathList.size(); i++) { File file = new File(picturePathList.get(i)); PictureFileBean fileBean = new PictureFileBean(); try { //压缩图片 File compressedFile = new Compressor(mContext).compressToFile(file); //把图片转为base64 String base64String = ImageToBase64.GetImageStr(compressedFile); //拼接图片集合 fileBean.setPicFile(base64String); fileBean.setPicType("JPEG"); fileList.add(fileBean); } catch (IOException e) { e.printStackTrace(); } } params.put("file", fileList); String json = mGson.toJson(params); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(JSON, json); final Request request = new Request.Builder() .url(mUrl) .addHeader("Authorization", "Bearer" + mToken) .post(requestBody) .build(); new Handler().postDelayed(new Runnable() { @Override public void run() { mClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { doFailure(netCallBack); } @Override public void onResponse(Call call, final Response response) throws IOException { doResponse(response, netCallBack); } }); } }, 200); } /** * 处理失败 * * @param netCallBack */ private void doFailure(final NetCallBack netCallBack) { mHandler.post(new Runnable() { @Override public void run() { netCallBack.onNetFailure(); } }); } /** * 处理成功 * * @param response * @param netCallBack * @throws IOException */ private void doResponse(Response response, final NetCallBack netCallBack) throws IOException { final String result = response.body().string(); if (!TextUtils.isEmpty(result)) { try { JSONObject jsonObject = new JSONObject(result); String success = jsonObject.getString("success"); if ("true".equals(success)) { mHandler.post(new Runnable() { @Override public void run() { netCallBack.onSuccess(result); } }); } else if ("false".equals(success)) { mHandler.post(new Runnable() { @Override public void run() { netCallBack.onError(result); } }); } } catch (JSONException e) { e.printStackTrace(); mHandler.post(new Runnable() { @Override public void run() { //服务器返回错误 netCallBack.onError(result); } }); } } } /** * 回调接口 */ public interface NetCallBack { //网络请求失败,没连网 void onNetFailure(); //网络请求成功 void onSuccess(String result); //网络请求成功,后台服务器有误 void onError(String result, String errorMessage); }}
我创建了一个内部接口类,用于处理网络请求结果的回调。里面有三个方法:
- onNetFailure()方法用于处理网络请求失败,没有联网的情况;
- onSuccess()方法用于处理网络请求成功的回调;
- onError()方法用于处理后台服务器返回错误的情况,通常可以结合错误码来更加规范的处理该结果 。
图片转Base64的方法
public class ImageToBase64 { /** * 图片转换成base64 * @param file * @return */ public static String GetImageStr(File file) { Bitmap bitmap = BitmapFactory.decodeFile(file.getPath()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);//参数100表示不压缩 byte[] bytes = bos.toByteArray(); try { bos.close(); } catch (IOException e) { e.printStackTrace(); } return Base64.encodeToString(bytes, Base64.DEFAULT); }}
关于调用,你可以在Activity里面直接调用Network网络层的方法,但是我不推荐你这样做。开发过程中基于高内聚、低耦合的原则,可以再写一个类,里面封装具体业务的请求方法,提供给Activity调用。
public class ActivityNet { private Context mContext; public AbnormalHandleActivityNet(Context context) { mContext = context; } /** * 确认处理异常点击事件 * * @param guid * @param abnormalCount * @param abnormalTypePosition * @param abnormalRemark * @param parentGuid * @param picturePathList */ public void btnConfirmHandle(String guid, String abnormalCount, int abnormalTypePosition, String abnormalRemark, String parentGuid, ArrayList<String> picturePathList, Network.NetCallBack netCallBack) { String url = UrlUtil.getUrl("tms.app.order.backed.backExSubmit"); Map<Object, Object> params = new HashMap<>(); params.put("guid", guid); params.put("exceptionQty", abnormalCount); params.put("exceptionType", abnormalTypePosition); params.put("exceptionMemo", abnormalRemark); params.put("parentGuid", parentGuid); Network network = new Network(mContext, url); network.upLoadPicture(params, picturePathList, netCallBack); }}
这是一个复杂的调用的方法,既需要上传参数,也需要上传图片。参数都是以键值对的方式添加进Map集合的,每个键的含义,是和后台哥们商量好的,接口文档里面都有。
picturePathList是一个图片路径的集合。我们可能会同时上传多张图片,得到多张图片的路径后,就构建成一个集合。
这个类里面是具体业务的网络请求方法,我们在Activity中直接调用这个类里面的方法。Activity可以通过实现Network.NetCallBack接口来处理结果并作出相应的UI更新。
希望能帮到你。
- OkHttp的封装(参数全部使用Json提交)
- Okhttp框架的二次封装,post json格式的参数
- OkHttp框架二次封装,post json格式的参数(上)
- OkHttp框架二次封装,post json格式的参数(下)
- OkHttp的使用和封装
- okHttp的简单封装使用
- OKHTTP封装公共参数
- OKhttp的封装工具类(可以直接使用)
- okhttp-utils的封装之okhttp的使用
- okhttp的使用以及简单的封装
- OKHttp使用拦截器(Interceptor)POST与GET方法,统一封装传公共参数
- Android:网络层的封装(使用OkHttp)
- OKHttp的基本使用和简单封装
- OkHttp的封装和使用详解
- OkHttp的基本使用以及二次封装
- okhttp的二次封装(基本使用)
- OkHttp简单的封装及使用
- okhttp提交请求body,json或者图片的方式
- E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
- Echarts位置移动
- php月、周、日始末时间的获取方法
- HttpClient容易忽视的细节——连接关闭
- js基本知识点总结-----js window对象
- OkHttp的封装(参数全部使用Json提交)
- APP自动更新功能
- Can't create handler inside thread that has not called Looper.prepare()
- 可视化分析库 matplotlib 基础01
- logstash的安装使用、收集json日志、csv日志总结
- 啥是B2B2C多用户商城
- eclipse从svn中导出web项目时不能添加到jboss中原因分析
- 努力不如热爱
- SPOJ Longest Common Substring II 后缀自动机(打印)