Giter Site home page Giter Site logo

myhttputils's Introduction

轻量级网络请求框架MyHttputils License Download

一、前言

本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高、效率显著提升。(但是使用风格基本没变哦)

2.0.2版本的基本的用法在《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)中有过详细的介绍。下面是对2.1.5版的详细使用介绍,对源码感兴趣的伙伴可以移步github了解更多的消息。

二、功能介绍

  • 1、支持get、post请求;

  • 2、支持http和https的协议;

  • 3、支持设置连接、读取超时时间(可选);

  • 4、支持json格式的请求结果(无论json格式多复杂,都能搞定);

  • 5、支持传入JavaBean对象(解析之后的javabean对象);

  • 6、支持回调方法中反应传入javabean对象,这样可以在回调方法中直接拿到解析过后的javabean对象;

  • 7、支持回调方法中更新UI(所以叫异步请求了);

  • 8、支持文件下载;---->带下载进度回调方法

  • 9、支持单文件上传;

  • 10、支持多文件上传;

  • 11、支持请求完成后回调--->onComplete方法;

  • 12、支持直接获取字符串;

  • 13、支持参数与文件同时上传;

  • 14、提供错误信息处理类;

MyHttpUtils满足了大部分的网络请求了,而且非常轻量级哦(大小:20.76k)

三、快速使用

使用gradle添加依赖(添加完之后Sync一下):

 compile 'com.huangdali:myhttputils:2.1.5'

当然了网络权限可别忘加哦

 <uses-permission android:name="android.permission.INTERNET" />

文件上传和下载也需要添加权限(不要这个功能的就不用加)

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

##四、入门案例 ###4.1、简单的一个网络请求(直接获取请求的结果--->字符串)

MyHttpUtils.build()//构建myhttputils
                .url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
                .onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
                    @Override
                    public void onSucceed(String result) {//请求成功之后会调用这个方法
                        //成功之后的拿到结果result进行处理
                    }
                    @Override
                    public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
                        //失败之后的拿到错误结果throwable进行处理
                    }
                });

通过上面的代码就能发起get请求;

下面结合一个案例类演示:用户输入字母,点击转换即可得到对应的大写字母。(小写转大写案例)

**接口:**http://192.168.2.153:8080/MyHttpUtilsServer/string.action

参数: content

请求方式: get

先看效果:

这里写图片描述

来看怎么实现:

/**
     * 单击转换按钮的事件
     *
     * @param view
     */
    public void onUpperCase(View view) {
        String content = etContent.getText().toString();//拿到用户输入的内容
        MyHttpUtils.build()//构建myhttputils
                .url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
                .addParam("content",content)
                .onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
                    @Override
                    public void onSucceed(String result) {//请求成功之后会调用这个方法----显示结果
                        tvResult.append("\n");
                        tvResult.append(Html.fromHtml("<font size='30px' color='red'>" + result + "</font>"));
                        tvResult.append("\n");
                    }
                    @Override
                    public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
                        ToastUtils.showToast(UpperCaseActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                    }
                });
    }

ToastUtils是简单封装的Toast显示工具,FailedMsgUtils是myhttputils提供的一个用于得到错误信息的工具

对于get请求,还可以这样搞------>直接拼接即可(参数含中文时不建议使用此方法)

     MyHttpUtils.build()//构建myhttputils
                .url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action?content=" + content)
                .onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
                 //此处省略回调处理
                    );
    }

参数多的情况怎么搞?加很多addParam()?继续往下看

4.2、get请求案例之Ip地址查询

**接口:**http://ip.taobao.com/service/getIpInfo.php

参数: ip

请求方式: get

返回结果:

{
    "code":0,
    "data":{
        "country":"**",
        "country_id":"CN",
        "area":"华南",
        "area_id":"800000",
        "region":"广东省",
        "region_id":"440000",
        "city":"广州市",
        "city_id":"440100",
        "county":"",
        "county_id":"-1",
        "isp":"腾讯网络",
        "isp_id":"1000153",
        "ip":"182.254.34.74"
    }
}

根据json就可以得到相对应的java对象,以前你是手动一个一个敲上去的吗?那看看《[android插件篇]如何快速通过json构建javabean对象(GsonFormat使用教程)》你就会如鱼得水了(知道的请忽略)。

/**
 * 查询按钮单击事件
 *
 * @param view
 */
public void onQuery(View view) {
    mProgressDialog.show();
    String ip = etIp.getText().toString().trim();
    MyHttpUtils.build()//构建myhttputils
            .url("http://ip.taobao.com/service/getIpInfo.php")//获取ip的url
            .addParam("ip", ip)//请求参数
               .setJavaBean(IPBean.class)//设置请求结果对应的java对象
               .onExecute(new CommCallback<IPBean>() {
                @Override
                public void onSucceed(IPBean ipBean) {
                    showResult(ipBean);
                }

                @Override
                public void onFailed(Throwable throwable) {
                    ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
                }
            });
}

/**
 * 显示结果
 * @param ipBean
 */
private void showResult(IPBean ipBean) {
    IPBean.DataBean ipInfo = ipBean.getData();
    tvIp.setText(etIp.getText().toString().trim());
    tvCountry.setText(ipInfo.getCountry());
    tvArea.setText(ipInfo.getArea());
    tvCity.setText(ipInfo.getCity());
    tvIsp.setText(ipInfo.getIsp());
    tvRegion.setText(ipInfo.getRegion());
}

效果:

这里写图片描述

通过myhttputils配置一些基础请求的参数即可完成android中复杂的网络请求,自动解析json为对象,即可拿到结果对应的java对象,链式的编程使得代码结构清晰的同时也简化了网络请求过程。

加点反馈效果----显示进度条对话框(可选回调方法onComplete的应用):

这里写图片描述

 /**
     * 查询按钮单击事件
     *
     * @param view
     */
    public void onQuery(View view) {
        mProgressDialog.show();//点击的时候显示进度条
        String ip = etIp.getText().toString().trim();
        MyHttpUtils.build()//构建myhttputils
                .url("http://ip.taobao.com/service/getIpInfo.php")//获取ip的url
                .addParam("ip", ip)//请求参数
                .setJavaBean(IPBean.class)//设置请求结果对应的java对象
                .onExecute(new CommCallback<IPBean>() {
                    @Override
                    public void onSucceed(IPBean ipBean) {
                        showResult(ipBean);
                    }
                    @Override
                    public void onFailed(Throwable throwable) {
                        ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
                    }
                    @Override
                    public void onComplete() {//完成之后回调
                        mProgressDialog.dismiss();//完成之后就关闭进度条
                    }
                });
    }

onComplete会在请求结束的时候回调,这样你可以在接收之后做出相应的友好提示,比如这里的关闭进度条;

4.3、Post请求之登录教程

**接口:**http://192.168.2.153:8080/MyHttpUtilsServer/userlogin

参数: username(用户名)、 pwd(密码)

请求方式: post

返回结果:

{"response":"succeed","msg":"登录成功"}

看效果:

这里写图片描述

上代码:

/**
 * 登录的单击事件
 *
 * @param view
 */
public void onLogin(View view) {
    String username = etUserName.getText().toString().trim();//获取用户输入的用户名
    String pwd = etPwd.getText().toString().trim();//获取用户输入的密码
    Map<String, Object> params = new HashMap<>();//构造请求的参数
    params.put("username", username);
    params.put("pwd", pwd);
    MyHttpUtils.build()
            .url("http://192.168.2.153:8080/MyHttpUtilsServer/userlogin")
            .addParams(params)
            .setJavaBean(LoginBean.class)
            .onExecuteByPost(new CommCallback<LoginBean>() {
                @Override
                public void onSucceed(LoginBean loginBean) {
                    ToastUtils.showToast(LoginActivity.this,loginBean.getMsg());
                }

                @Override
                public void onFailed(Throwable throwable) {
                    ToastUtils.showToast(LoginActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                }
            });
}

多个参数的情况加建议使用map对象构造然后addPatams即可。

4.4 文件下载

**接口:**http://192.168.2.153:8080/MyHttpUtilsServer/g3box_uesr_2.3.1.apk

**参数:**无

请求方式: get

**返回结果:**无

代码:

  /**
     * 开始下载按钮单击事件
     *
     * @param view
     */
    public void onDownload(View view) {
        MyHttpUtils.build()
                .url("http://192.168.2.153:8080/MyHttpUtilsServer/g3box_uesr_2.3.1.apk")
                .setConnTimeOut(6000)//设置连接超时时间[可选,默认5s]
                .setReadTimeOut(5*60*1000)//设置读取超时时间[可选,默认30s]
                .onExecuteDwonload(new CommCallback() {
                    @Override
                    public void onSucceed(Object o) {
                        ToastUtils.showToast(DownloadActivity.this, "下载完成");
                    }
                    @Override
                    public void onFailed(Throwable throwable) {
                        ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                    }
                    @Override
                    public void onDownloading(long total, long current) {
                        System.out.println(total+"-------"+current);
                        tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100)+"%");//保留两位小数
                    }
                });

这里引入了setConnTimeOut (设置连接超时时间),由于下载大文件的话比较耗时读取时间是30s可能不够 所以可以通过setReadTimeOut设置长时间,比如5分钟=5601000【两个方法传入的都是时间的毫秒值】

温馨提示: myhttputils模式会下载文件到sdcard/download目录下面,如需修改,使用 setFileSaveDir("/sdcard/myapp") 即可

效果图:

这里写图片描述

4.5、文件上传

接口: http://192.168.2.153:8080/MyHttpUtilsServer/upload

参数:

请求方式:

返回结果:

4.5.1、单文件上传

效果图:

这里写图片描述

上代码:

/**
 * 单文件上传
 *
 * @param view
 */
public void onUpload(View view) {
    mProgressDialog.show();
    MyHttpUtils.build()
            .uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
            .addFile("sdcard/download/wifi.exe")
            .onExecuteUpLoad(new CommCallback() {
                @Override
                public void onComplete() {
                    mProgressDialog.dismiss();
                    ToastUtils.showToast(UploadActivity.this,"上传完成");
                }

                @Override
                public void onSucceed(Object o) {

                }

                @Override
                public void onFailed(Throwable throwable) {
                    ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                }
            });
}

**温馨提示:**添加文件可以通过addFile(文件的绝对路径)和addFile(new File(文件绝对路径)),还有就是这里使用uploadUrl而不是url来设置请求接口哦

4.5.2、多文件上传

多文件上传有两种方式,即addFile多次addFiles一个集合,addFile就不演示了,下面演示addFiles

上代码:

/**
 * 多文件上传
 *
 * @param view
 */
public void onUploadMult(View view) {
    mProgressDialog.show();
    List<File>files=new ArrayList<>();
    files.add(new File("sdcard/download/wifi.exe"));
    files.add(new File("sdcard/download/g3box_uesr_2.3.1.apk"));
    MyHttpUtils.build()
            .uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
            .addFiles(files)
            .onExecuteUpLoad(new CommCallback() {
                @Override
                public void onComplete() {
                    mProgressDialog.dismiss();
                    ToastUtils.showToast(UploadActivity.this,"上传完成");
                }

                @Override
                public void onSucceed(Object o) {

                }

                @Override
                public void onFailed(Throwable throwable) {
                    ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                }
            });
}

4.6、参数与文件同时上传

**接口:**http://192.168.2.153:8080/MyHttpUtilsServer/string.actionhttp://192.168.2.153:8080/MyHttpUtilsServer/upload

参数: content

请求方式: get

效果:

这里写图片描述

代码:

/**
     * 参数与文件同时上传
     *
     * @param view
     */
    public void onUploadParamFile(View view) {
        MyHttpUtils.build()//构建myhttputils
                .url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
                .uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
                .addParam("content", "abc")
                .addFile("sdcard/download/wifi.exe")
                .onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
                    @Override
                    public void onSucceed(String result) {//请求成功之后会调用这个方法
                        ToastUtils.showToast(UploadActivity.this, "转换成功-------->" + result);
                    }
                    @Override
                    public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
                        ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                    }
                })
                .onExecuteUpLoad(new CommCallback() {
                    @Override
                    public void onComplete() {
                        mProgressDialog.dismiss();
                        ToastUtils.showToast(UploadActivity.this, "上传完成");
                    }
                    @Override
                    public void onSucceed(Object o) {
                    }
                    @Override
                    public void onFailed(Throwable throwable) {
                        ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                    }
                });
    }

参数与文件同时上传,其实就是请求的组合


五、使用小技巧

**5.1、日志打印 **

为了方便调试,myhttputils还会在logcat中打印i级别的json字符串日志,如日志太多可添加HttpRequester为过滤条件,看图(是不是很容易就看出来了):

这里写图片描述

上面是请求正常的情况下打印,同样错误情况下也会有e级别日志------->下面这个是url地址错误时的错误信息

这里写图片描述

5.2、错误信息对照表

如果你不想使用myhttputils提供的FailedMsgUtils.getErrMsgStr()方法,你可以自己根据返回的throwable进行处理,下面是myhttputils可能会截获的异常对照表:

这里写图片描述

5.3、关于请求参数的配置

如果你觉得在一条链上set方法太多不太好,myhttputils还提供了HttpBody方法,先构造完了,通过setHttpBody即可。(这种方式需要你自己判断文件是否存在哦)

下面以上面下载的案例来调整:

 /**
     * 开始下载按钮单击事件
     *
     * @param view
     */
    public void onDownload(View view) {
        HttpBody body = new HttpBody();
        body.setUrl("http://192.168.2.153:8080/MyHttpUtilsServer/wifi.exe")
                .setConnTimeOut(6000)
                .setFileSaveDir("/sdcard/myapp")
                .setReadTimeOut(5 * 60 * 1000);
        MyHttpUtils.build()
                .setHttpBody(body)
                .onExecuteDwonload(new CommCallback() {
                    @Override
                    public void onSucceed(Object o) {
                        ToastUtils.showToast(DownloadActivity.this, "下载完成");
                    }
                    @Override
                    public void onFailed(Throwable throwable) {
                        ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
                    }
                    @Override
                    public void onDownloading(long total, long current) {
                        System.out.println(total + "-------" + current);
                        tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100) + "%");//保留两位小数
                    }
                });
    }

最后

如反馈良好,可以考虑详解源码,留言告诉我吧

demo、服务器代码和源码地址:https://github.com/huangdali/myhttputils

源码和文档下载地址:https://bintray.com/huangdali/myhttputils/myhttputils1.0/2.1.5

如有bug、新功能建议请留言,我一定以最快的速度回复。

尊重原创,转载请注明出处: http://blog.csdn.net/qq137722697

myhttputils's People

Contributors

huangdali avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

myhttputils's Issues

请求头

好像不支持添加请求头啊,要如何添加呢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.