okhttp工具类封装

简介: okhttp工具类封装

一、工具类功能

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持

最后会对上述几个功能进行封装,完整的封装类的地址见:https://github.com/hongyangAndroid/okhttp-utils

使用前,对于Android Studio的用户,可以选择添加:

compile'com.squareup.okhttp:okhttp:2.4.0'

或者Eclipse的用户,可以下载最新的jar okhttp he latest JAR ,添加依赖就可以用了。

注意:okhttp内部依赖okio,别忘了同时导入okio:

gradle: compile'com.squareup.okio:okio:1.5.0'

最新的jar地址:okio the latest JAR

相当的强大的工具

packagesocketio.hd.com.clouddisc.utils;
importandroid.os.Handler;
importandroid.os.Looper;
importandroid.widget.ImageView;
importcom.google.gson.Gson;
importcom.google.gson.internal.$Gson$Types;
importcom.squareup.okhttp.Call;
importcom.squareup.okhttp.Callback;
importcom.squareup.okhttp.FormEncodingBuilder;
importcom.squareup.okhttp.Headers;
importcom.squareup.okhttp.MediaType;
importcom.squareup.okhttp.MultipartBuilder;
importcom.squareup.okhttp.OkHttpClient;
importcom.squareup.okhttp.Request;
importcom.squareup.okhttp.RequestBody;
importcom.squareup.okhttp.Response;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.lang.reflect.ParameterizedType;
importjava.lang.reflect.Type;
importjava.net.CookieManager;
importjava.net.CookiePolicy;
importjava.net.FileNameMap;
importjava.net.URLConnection;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Set;
/*** Created by zhy on 15/8/17.*/publicclassOkHttpClientManager{
privatestaticOkHttpClientManagermInstance;
privateOkHttpClientmOkHttpClient;
privateHandlermDelivery;
privateGsonmGson;
privatestaticfinalStringTAG="OkHttpClientManager";
privateOkHttpClientManager()
    {
mOkHttpClient=newOkHttpClient();
//cookie enabledmOkHttpClient.setCookieHandler(newCookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
mDelivery=newHandler(Looper.getMainLooper());
mGson=newGson();
    }
publicstaticOkHttpClientManagergetInstance()
    {
if (mInstance==null)
        {
synchronized (OkHttpClientManager.class)
            {
if (mInstance==null)
                {
mInstance=newOkHttpClientManager();
                }
            }
        }
returnmInstance;
    }
/*** 同步的Get请求** @param url* @return Response*/privateResponse_getAsyn(Stringurl) throwsIOException    {
finalRequestrequest=newRequest.Builder()
                .url(url)
                .build();
Callcall=mOkHttpClient.newCall(request);
Responseexecute=call.execute();
returnexecute;
    }
/*** 同步的Get请求** @param url* @return 字符串*/privateString_getAsString(Stringurl) throwsIOException    {
Responseexecute=_getAsyn(url);
returnexecute.body().string();
    }
/*** 异步的get请求** @param url* @param callback*/privatevoid_getAsyn(Stringurl, finalResultCallbackcallback)
    {
finalRequestrequest=newRequest.Builder()
                .url(url)
                .build();
deliveryResult(callback, request);
    }
/*** 同步的Post请求** @param url* @param params post的参数* @return*/privateResponse_post(Stringurl, Param... params) throwsIOException    {
Requestrequest=buildPostRequest(url, params);
Responseresponse=mOkHttpClient.newCall(request).execute();
returnresponse;
    }
/*** 同步的Post请求** @param url* @param params post的参数* @return 字符串*/privateString_postAsString(Stringurl, Param... params) throwsIOException    {
Responseresponse=_post(url, params);
returnresponse.body().string();
    }
/*** 异步的post请求** @param url* @param callback* @param params*/privatevoid_postAsyn(Stringurl, finalResultCallbackcallback, Param... params)
    {
Requestrequest=buildPostRequest(url, params);
deliveryResult(callback, request);
    }
/*** 异步的post请求** @param url* @param callback* @param params*/privatevoid_postAsyn(Stringurl, finalResultCallbackcallback, Map<String, String>params)
    {
Param[] paramsArr=map2Params(params);
Requestrequest=buildPostRequest(url, paramsArr);
deliveryResult(callback, request);
    }
/*** 同步基于post的文件上传** @param params* @return*/privateResponse_post(Stringurl, File[] files, String[] fileKeys, Param... params) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, files, fileKeys, params);
returnmOkHttpClient.newCall(request).execute();
    }
privateResponse_post(Stringurl, Filefile, StringfileKey) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, newFile[]{file}, newString[]{fileKey}, null);
returnmOkHttpClient.newCall(request).execute();
    }
privateResponse_post(Stringurl, Filefile, StringfileKey, Param... params) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, newFile[]{file}, newString[]{fileKey}, params);
returnmOkHttpClient.newCall(request).execute();
    }
/*** 异步基于post的文件上传** @param url* @param callback* @param files* @param fileKeys* @throws IOException*/privatevoid_postAsyn(Stringurl, ResultCallbackcallback, File[] files, String[] fileKeys, Param... params) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, files, fileKeys, params);
deliveryResult(callback, request);
    }
/*** 异步基于post的文件上传,单文件不带参数上传** @param url* @param callback* @param file* @param fileKey* @throws IOException*/privatevoid_postAsyn(Stringurl, ResultCallbackcallback, Filefile, StringfileKey) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, newFile[]{file}, newString[]{fileKey}, null);
deliveryResult(callback, request);
    }
/*** 异步基于post的文件上传,单文件且携带其他form参数上传** @param url* @param callback* @param file* @param fileKey* @param params* @throws IOException*/privatevoid_postAsyn(Stringurl, ResultCallbackcallback, Filefile, StringfileKey, Param... params) throwsIOException    {
Requestrequest=buildMultipartFormRequest(url, newFile[]{file}, newString[]{fileKey}, params);
deliveryResult(callback, request);
    }
/*** 异步下载文件** @param url* @param destFileDir 本地文件存储的文件夹* @param callback*/privatevoid_downloadAsyn(finalStringurl, finalStringdestFileDir, finalResultCallbackcallback)
    {
finalRequestrequest=newRequest.Builder()
                .url(url)
                .build();
finalCallcall=mOkHttpClient.newCall(request);
call.enqueue(newCallback()
        {
@OverridepublicvoidonFailure(finalRequestrequest, finalIOExceptione)
            {
sendFailedStringCallback(request, e, callback);
            }
@OverridepublicvoidonResponse(Responseresponse)
            {
InputStreamis=null;
byte[] buf=newbyte[2048];
intlen=0;
FileOutputStreamfos=null;
try                {
is=response.body().byteStream();
Filefile=newFile(destFileDir, getFileName(url));
fos=newFileOutputStream(file);
while ((len=is.read(buf)) !=-1)
                    {
fos.write(buf, 0, len);
                    }
fos.flush();
//如果下载文件成功,第一个参数为文件的绝对路径sendSuccessResultCallback(file.getAbsolutePath(), callback);
                } catch (IOExceptione)
                {
sendFailedStringCallback(response.request(), e, callback);
                } finally                {
try                    {
if (is!=null) is.close();
                    } catch (IOExceptione)
                    {
                    }
try                    {
if (fos!=null) fos.close();
                    } catch (IOExceptione)
                    {
                    }
                }
            }
        });
    }
privateStringgetFileName(Stringpath)
    {
intseparatorIndex=path.lastIndexOf("/");
return (separatorIndex<0) ?path : path.substring(separatorIndex+1, path.length());
    }
/*** 加载图片** //@param view* //@param url* @throws IOException*//* private void _displayImage(final ImageView view, final String url, final int errorResId){final Request request = new Request.Builder().url(url).build();Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback(){@Overridepublic void onFailure(Request request, IOException e){setErrorResId(view, errorResId);}@Overridepublic void onResponse(Response response){InputStream is = null;try{is = response.body().byteStream();ImageUtils.ImageSize actualImageSize = ImageUtils.getImageSize(is);ImageUtils.ImageSize imageViewSize = ImageUtils.getImageViewSize(view);int inSampleSize = ImageUtils.calculateInSampleSize(actualImageSize, imageViewSize);try{is.reset();} catch (IOException e){response = _getAsyn(url);is = response.body().byteStream();}BitmapFactory.Options ops = new BitmapFactory.Options();ops.inJustDecodeBounds = false;ops.inSampleSize = inSampleSize;final Bitmap bm = BitmapFactory.decodeStream(is, null, ops);mDelivery.post(new Runnable(){@Overridepublic void run(){view.setImageBitmap(bm);}});} catch (Exception e){setErrorResId(view, errorResId);} finally{if (is != null) try{is.close();} catch (IOException e){e.printStackTrace();}}}});}*/privatevoidsetErrorResId(finalImageViewview, finalinterrorResId)
    {
mDelivery.post(newRunnable()
        {
@Overridepublicvoidrun()
            {
view.setImageResource(errorResId);
            }
        });
    }
//*************对外公布的方法************publicstaticResponsegetAsyn(Stringurl) throwsIOException    {
returngetInstance()._getAsyn(url);
    }
publicstaticStringgetAsString(Stringurl) throwsIOException    {
returngetInstance()._getAsString(url);
    }
publicstaticvoidgetAsyn(Stringurl, ResultCallbackcallback)
    {
getInstance()._getAsyn(url, callback);
    }
publicstaticResponsepost(Stringurl, Param... params) throwsIOException    {
returngetInstance()._post(url, params);
    }
publicstaticStringpostAsString(Stringurl, Param... params) throwsIOException    {
returngetInstance()._postAsString(url, params);
    }
publicstaticvoidpostAsyn(Stringurl, finalResultCallbackcallback, Param... params)
    {
getInstance()._postAsyn(url, callback, params);
    }
publicstaticvoidpostAsyn(Stringurl, finalResultCallbackcallback, Map<String, String>params)
    {
getInstance()._postAsyn(url, callback, params);
    }
publicstaticResponsepost(Stringurl, File[] files, String[] fileKeys, Param... params) throwsIOException    {
returngetInstance()._post(url, files, fileKeys, params);
    }
publicstaticResponsepost(Stringurl, Filefile, StringfileKey) throwsIOException    {
returngetInstance()._post(url, file, fileKey);
    }
publicstaticResponsepost(Stringurl, Filefile, StringfileKey, Param... params) throwsIOException    {
returngetInstance()._post(url, file, fileKey, params);
    }
publicstaticvoidpostAsyn(Stringurl, ResultCallbackcallback, File[] files, String[] fileKeys, Param... params) throwsIOException    {
getInstance()._postAsyn(url, callback, files, fileKeys, params);
    }
publicstaticvoidpostAsyn(Stringurl, ResultCallbackcallback, Filefile, StringfileKey) throwsIOException    {
getInstance()._postAsyn(url, callback, file, fileKey);
    }
publicstaticvoidpostAsyn(Stringurl, ResultCallbackcallback, Filefile, StringfileKey, Param... params) throwsIOException    {
getInstance()._postAsyn(url, callback, file, fileKey, params);
    }
publicstaticvoiddisplayImage(finalImageViewview, Stringurl, interrorResId) throwsIOException    {
//getInstance()._displayImage(view, url, errorResId);    }
publicstaticvoiddisplayImage(finalImageViewview, Stringurl)
    {
//getInstance()._displayImage(view, url, -1);    }
publicstaticvoiddownloadAsyn(Stringurl, StringdestDir, ResultCallbackcallback)
    {
getInstance()._downloadAsyn(url, destDir, callback);
    }
//****************************privateRequestbuildMultipartFormRequest(Stringurl, File[] files,
String[] fileKeys, Param[] params)
    {
params=validateParam(params);
MultipartBuilderbuilder=newMultipartBuilder()
                .type(MultipartBuilder.FORM);
for (Paramparam : params)
        {
builder.addPart(Headers.of("Content-Disposition", "form-data; name=\""+param.key+"\""),
RequestBody.create(null, param.value));
        }
if (files!=null)
        {
RequestBodyfileBody=null;
for (inti=0; i<files.length; i++)
            {
Filefile=files[i];
StringfileName=file.getName();
fileBody=RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
//TODO 根据文件名设置contentTypebuilder.addPart(Headers.of("Content-Disposition",
"form-data; name=\""+fileKeys[i] +"\"; filename=\""+fileName+"\""),
fileBody);
            }
        }
RequestBodyrequestBody=builder.build();
returnnewRequest.Builder()
                .url(url)
                .post(requestBody)
                .build();
    }
privateStringguessMimeType(Stringpath)
    {
FileNameMapfileNameMap=URLConnection.getFileNameMap();
StringcontentTypeFor=fileNameMap.getContentTypeFor(path);
if (contentTypeFor==null)
        {
contentTypeFor="application/octet-stream";
        }
returncontentTypeFor;
    }
privateParam[] validateParam(Param[] params)
    {
if (params==null)
returnnewParam[0];
elsereturnparams;
    }
privateParam[] map2Params(Map<String, String>params)
    {
if (params==null) returnnewParam[0];
intsize=params.size();
Param[] res=newParam[size];
Set<Map.Entry<String, String>>entries=params.entrySet();
inti=0;
for (Map.Entry<String, String>entry : entries)
        {
res[i++] =newParam(entry.getKey(), entry.getValue());
        }
returnres;
    }
privatestaticfinalStringSESSION_KEY="Set-Cookie";
privatestaticfinalStringmSessionKey="JSESSIONID";
privateMap<String, String>mSessions=newHashMap<String, String>();
privatevoiddeliveryResult(finalResultCallbackcallback, Requestrequest)
    {
mOkHttpClient.newCall(request).enqueue(newCallback()
        {
@OverridepublicvoidonFailure(finalRequestrequest, finalIOExceptione)
            {
sendFailedStringCallback(request, e, callback);
            }
@OverridepublicvoidonResponse(finalResponseresponse)
            {
try                {
finalStringstring=response.body().string();
if (callback.mType==String.class)
                    {
sendSuccessResultCallback(string, callback);
                    } else                    {
Objecto=mGson.fromJson(string, callback.mType);
sendSuccessResultCallback(o, callback);
                    }
                } catch (IOExceptione)
                {
sendFailedStringCallback(response.request(), e, callback);
                } catch (com.google.gson.JsonParseExceptione)//Json解析的错误                {
sendFailedStringCallback(response.request(), e, callback);
                }
            }
        });
    }
privatevoidsendFailedStringCallback(finalRequestrequest, finalExceptione, finalResultCallbackcallback)
    {
mDelivery.post(newRunnable()
        {
@Overridepublicvoidrun()
            {
if (callback!=null)
callback.onError(request, e);
            }
        });
    }
privatevoidsendSuccessResultCallback(finalObjectobject, finalResultCallbackcallback)
    {
mDelivery.post(newRunnable()
        {
@Overridepublicvoidrun()
            {
if (callback!=null)
                {
callback.onResponse(object);
                }
            }
        });
    }
privateRequestbuildPostRequest(Stringurl, Param[] params)
    {
if (params==null)
        {
params=newParam[0];
        }
FormEncodingBuilderbuilder=newFormEncodingBuilder();
for (Paramparam : params)
        {
builder.add(param.key, param.value);
        }
RequestBodyrequestBody=builder.build();
returnnewRequest.Builder()
                .url(url)
                .post(requestBody)
                .build();
    }
publicstaticabstractclassResultCallback<T>    {
TypemType;
publicResultCallback()
        {
mType=getSuperclassTypeParameter(getClass());
        }
staticTypegetSuperclassTypeParameter(Class<?>subclass)
        {
Typesuperclass=subclass.getGenericSuperclass();
if (superclassinstanceofClass)
            {
thrownewRuntimeException("Missing type parameter.");
            }
ParameterizedTypeparameterized= (ParameterizedType) superclass;
return$Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
        }
publicabstractvoidonError(Requestrequest, Exceptione);
publicabstractvoidonResponse(Tresponse);
    }
publicstaticclassParam    {
publicParam()
        {
        }
publicParam(Stringkey, Stringvalue)
        {
this.key=key;
this.value=value;
        }
Stringkey;
Stringvalue;
    }
}
目录
相关文章
|
1月前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
1627 2
|
9月前
|
XML Java Maven
防止反编译,保护你的SpringBoot项目
ClassFinal-maven-plugin 是一个用于加密 Java 字节码的工具,能够保护 Spring Boot 项目中的源代码和配置文件不被非法获取或篡改。使用步骤包括:安装并设置 Maven、创建 Maven 项目、将 jar 包作为依赖添加到 pom.xml 文件中、下载并安装 ClassFinal-maven-plugin 插件、配置插件参数(如加密密钥和目标机器 ID),最后通过命令 `mvn clean package classfinal:encrypt` 执行加密。插件通过 JNI 实现编译时混淆和加密,并在运行时动态解密类文件。
661 14
|
11月前
|
SQL JSON 前端开发
若依RuoYi脚手架二次开发教程(二次开发必学技能)
本次我们将通过一个菜品管理模块开发的案例,来演示拿到若依框架后,如何在若依管理系统上进行二次开发,升级改造为自己的管理系统。适合以若依作为项目脚手架的公司开发人员、毕业设计的学生及开源项目学习者。
6564 1
若依RuoYi脚手架二次开发教程(二次开发必学技能)
|
12月前
|
Java UED Spring
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
5649 1
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
NoSQL MongoDB 关系型数据库
13个Mongodb GUI可视化管理工具,总有一款适合你
本文介绍了13个好用的MongoDB可视化工具。Robomongo,MongoDB Compass,phpMoAdmin等
113901 0
13个Mongodb GUI可视化管理工具,总有一款适合你
|
存储 jenkins Java
CentOS上安装Jenkins
CentOS上安装Jenkins
496 0
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
21486 0
|
JSON API Apache
基于OkHttp网络通信工具类(发送get、post请求、文件上传和下载)
okhttp是专注于提升网络连接效率的http客户端。 优点: 1、它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力。 2、okhttp 对http和https都有良好的支持。 3、okhttp 不用担心android版本变换的困扰。 4、成熟的网络请求解决方案,比HttpURLConnection更好用。 5、支持异步发送网络请求,响应可在线程处理。