# MyHttpUtils
**Repository Path**: zhanghe0320/MyHttpUtils
## Basic Information
- **Project Name**: MyHttpUtils
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-22
- **Last Updated**: 2021-06-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
>尊重原创,转载请注明出处:[原文查看惊喜更多](http://blog.csdn.net/qq137722697) http://blog.csdn.net/qq137722697
#《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)
##一、前言
基本的用法在[《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架](http://blog.csdn.net/qq137722697/article/details/52414372)中有过详细的介绍。下面是对2.x版的详细使用介绍,对源码感兴趣的伙伴可以移步[github](https://github.com/huangdali/myhttputils)了解更多的消息。适用场景:1、项目中应该各种原因不能适用okhttp、retrofit的,2、想摆脱Volley、xUtils(功能太多,很多用不上)的,3、学习使用的。看过源码的伙伴应该知道MyHttpUtils底层就是通过HtttpUrlConnection实现的,用Android亲儿子实现的,不需要添加任何第三方的库。
##二、功能介绍
1、支持get、post请求;
2、支持http和https的协议;
3、支持设置连接、读取超时时间(可选);
4、支持json格式的请求结果(无论json格式多复杂,都能搞定);
5、支持传入JavaBean对象(解析之后的javabean对象);
6、支持回调方法中反应传入javabean对象,这样可以在回调方法中直接拿到解析过后的javabean对象;
7、支持回调方法中更新UI(所以叫异步请求了);
(------------------上面是1.X版本的功能,下面是2.x版本新增的功能---------------)
***8、支持文件下载;(必须得带下载进度回调呀)***
***9、支持单文件上传;***
***10、支持多文件上传。***
>MyHttpUtils满足了大部分的网络请求了,而且非常轻量级哦
##三、使用方法
使用gradle添加依赖:
```
compile 'com.huangdali:myhttputils:2.0.2'
```
当然了网络权限可别忘了加哦
```
```
文件上传和下载也需要添加权限(不要这个功能的就不要加了)
```
```
##四、get请求
对于get请求,如果有请求的参数,直接拼接到接口的后边即可。
下面通过一个查询ip地址信息的demo来介绍get方式的使用(先来看运行的效果图):

上代码:
```
/**
* 获取IP地址的监听事件
*
* @param view
*/
public void onGetIP(View view) {
String url = "http://ip.taobao.com/service/getIpInfo.php?ip=182.254.34.74";//请求的接口
new MyHttpUtils()
.url(url)//请求的url
.setJavaBean(IPBean.class)//设置需要解析成的javabean对象
.onExecute(new CommCallback() {//异步,泛型为解析后的javabean对象
@Override
public void onSucess(IPBean ipBean) {//成功之后回调
ToastUtils.showMsg(MainActivity.this,ipBean.toString());
}
@Override
public void onFailed(String msg) {//失败时候回调
Log.e("MyHttpUtilsDemo",msg);
}
});
}
```
方法及参数说明:
***1、url():***设置请求的接口地址,参数类型为String。(**必填**)
***2、setJavaBean():***设置解析之后的JavaBean对象,记得加.class。(**必填**)
***3、onExecute():***设置开始请求(get)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(**必填**)
***4、setReadTimeout():***设置读取超时时间(不设置时默认30s),参数为整型,单位:毫秒。(**可选**)
***5、setConnTimeout():***设置连接超时时间(不设置时默认5s),参数为整型,单位:毫秒。(**可选**)
>**特别说明**:如果请求参数带有中文的,最好将该字符串编码(UTF-8)再拼接。
`String text="";
text= URLEncoder.encode(text,"UTF-8");`\\\会抛一个异常哦
##五、post请求
下面通过一个获取用户备注、和跟踪信息的例子来说明post的用法(先看效果图):

上代码:
```
public void onGetRemark(View view) {
String remarkUrl = "http://192.168.1.161:8080/Test/userInfoController/updateUser.action";
HashMap param = new HashMap<>();
param.put("userid", "7cf6871beeed856df47eb189");
param.put("uid", "8011bddb58588ab54");
new MyHttpUtils()
.url(remarkUrl)
.addParam(param)
.setJavaBean(RemarkBean.class)
.onExecuteByPost(new CommCallback() {
@Override
public void onSucess(RemarkBean remarkBean) {//成功之后回调
ToastUtils.showMsg(MainActivity.this,ipBean.toString());
}
@Override
public void onFailed(String msg) {//失败时候回调
Log.e("MyHttpUtilsDemo",msg);
}
});
}
}
```
方法及参数说明:
***1、url():***设置请求的接口地址,参数类型为String。(**必填**)
***2、setJavaBean():***设置解析之后的JavaBean对象,记得加.class。(**必填**)
***3、addParam():***设置post请求的参数,参数为hashmap类型。(**必填**)
***4、onExecuteByPost():***设置开始请求(post)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(**必填**)
***5、setReadTimeout():***设置读取超时时间(不设置即为默认30s),参数为整型,单位:毫秒。(**可选**)
***6、setConnTimeout():***设置连接超时时间(不设置即为默认5s),参数为整型,单位:毫秒。(**可选**)
>通过上面的两个例子是不是觉得这个框架很好用,只需要传url,javabean就可以在回调方法里面得到想要的结果,你会发现你的代码里面没有了子线程、没有了handle,链式编程使得代码结构更加清晰。如果对Rxjava,Retrofit,OkHttp熟悉的朋友肯定觉得这种方式似曾相识吧。
##六、如何快速通过json构建javabean对象
说这么多,你可能会自己慢慢敲javabean对象,看本节标题就知道要干嘛了,这节讲教你如何快速通过json构建javabean对象(知道的略过)。
本节已经单独抽取为一篇博客(因为好几篇博客都要讲解这个),请查看[\[android插件篇\]如何快速通过json构建javabean对象(GsonFormat使用教程)](http://blog.csdn.net/qq137722697/article/details/52852804) http://blog.csdn.net/qq137722697/article/details/52852804
##七、文件下载
这里我用自己搭的本地服务器接口作为演示:上代码
```
String url = "http://192.168.0.107:8080/UpLoadDemo/fg.exe";
new MyHttpUtils()
.url(url)
.setFileSavePath("/sdcard/downloadtest")//不要这里只是填写文件保存的路径,不包括文件名哦
.setReadTimeout(5 * 60 * 1000)//由于下载文件耗时比较大,所以设置读取时间为5分钟
.downloadFile(new CommCallback() {
@Override
public void onSucess(String msg) {
ToastUtils.showMsg(MainActivity.this, msg);
}
@Override
public void onFailed(String s) {
}
/**
* 可以重写进度回调方法
* @param total
* @param current
*/
@Override
public void onDownloading(long total, long current) {
tvProgress.setText("当前进度:" + new DecimalFormat("######0.00").format(((double) current / total) * 100) + "%");
}
});
```
看效果:

##八、文件上传
文件上传---支持单文件和多文件上传。不过在上传之前先给出一个用于接收文件的服务代码(java写的)
###8.1、服务端代码(已经有文件接收接口的略过)
服务端代码是一个非常简单的servlet,用了commons-fileupload来做文件接收。[jar包在这里下载](http://download.csdn.net/detail/qq137722697/9657409)
```
public class UpLoadServlet extends HttpServlet {
private static final long serialVersionUID = -8705046949443366079L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("请求了。。。。。。。。");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
// String userId = request.getParameter("userid");
// 创建文件项目工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件上传路径
File uploadDir = new File(this.getServletContext().getRealPath(
"/upload/"));// 设置文件上传的路径为项目名/upload/userid/
if (!uploadDir.exists()) {// 如果改文件夹不存在就创建
uploadDir.mkdirs();
}
// 获取系统默认的临时文件保存路径,该路径为Tomcat根目录下的temp文件夹
String temp = System.getProperty("java.io.tmpdir");
// 设置缓冲区大小为 5M
factory.setSizeThreshold(1024 * 1024 * 5);
// 设置临时文件夹为temp
factory.setRepository(new File(temp));
// 用工厂实例化上传组件,ServletFileUpload 用来解析文件上传请求
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
try {
List list = servletFileUpload.parseRequest(request);
for (FileItem fileItem : list) {
File file = new File(uploadDir, fileItem.getName());
if (!file.exists()) {// 文件不存在才创建
fileItem.write(file);// 保存文件
}
}
pw.write("{\"message\":\"上传成功\"}");
System.out.println("{\"message\":\"上传成功\"}");
} catch (Exception e) {
pw.write("{\"message\":\"上传失败\"}");
System.out.println("{\"message\":\"上传失败\"}");
}
}
}
```
###8.2、单文件上传
下面以上传sd卡中的一张index.png(文件大小342KB)图片的demo演示当文件上传。上代码:
```
new MyHttpUtils()
.url("http://192.168.0.107:8080/UpLoadDemo/upload")
.setJavaBean(UploadResultBean.class)
.addUploadFile(new File("/sdcard/index.png"))//设置需上传文件
.uploadFile(new CommCallback() {
@Override
public void onSucess(UploadResultBean uploadResultBean) {
ToastUtils.showMsg(MainActivity.this, uploadResultBean.getMessage());
}
@Override
public void onFailed(String msg) {
ToastUtils.showMsg(MainActivity.this, msg);
}
});
```
看效果:

###8.3、多文件上传
上传两个demo.exe(8M)、mylog.png(247K)文件,上代码:
```
ArrayListfileList=new ArrayList<>();//文件列表
fileList.add(new File("/sdcard/demo.exe"));
fileList.add(new File("/sdcard/mylog.png"));
new MyHttpUtils()
.url("http://192.168.0.107:8080/UpLoadDemo/upload")
.setJavaBean(UploadResultBean.class)
.addUploadFiles(fileList)//设置需上传的多个文件
.uploadFileMult(new CommCallback() {
@Override
public void onSucess(UploadResultBean uploadResultBean) {
ToastUtils.showMsg(MainActivity.this, uploadResultBean.getMessage());
}
@Override
public void onFailed(String msg) {
ToastUtils.showMsg(MainActivity.this, msg);
}
});
```
看效果:

##九、下载地址
源码及demo下载地址:https://github.com/huangdali/MyHttpUtilsDemo(欢迎star)
>访问我的博客主页了解更多知识:http://blog.csdn.net/qq137722697
----------
>访问我的github主页了解更多开源框架:https://github.com/huangdali