eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 46936|回复: 252
收起左侧

█ LiteHttp █ 极简且智能的 android HTTP 框架【专注网络连接】

    [复制链接]

该用户从未签到

4

主题

157

帖子

1352

e币
发表于 2014-3-16 18:48:51 | 显示全部楼层 |阅读模式
本帖最后由 移动天宇 于 2014-12-11 16:50 编辑

简介

    LiteHttp是一款简单、智能、灵活的HTTP框架库,它在请求和响应层面做到了全自动构建和解析,主要用于Android快速开发。借助LiteHttp你只需要一行代码即可完美实现http连接,它全面支持GET, POST, PUT, DELETE, HEAD, TRACE, OPTIONS 和 PATCH八种基本类型。LiteHttp能将Java Model转化为http请求参数,也能将响应的json语句智能转化为Java Model,这种全自动解析策略将节省你大量的构建请求、解析响应的时间。并且,你能自己继承重新实现Dataparser这个抽象类并设置给Request,来将http原始的inputstream转化为任何你想要的东西。


引言
  2012年底开发聚划算android至今,积累了不少的教训与经验,这里陆续会向小伙伴输出一些简单的库。
  一个案例展示LiteHttp的基础功能: http://litesuits.github.io/guide/http/get-start.html
  项目来自我的开源站点:http://litesuits.com
  看到下面有反馈中文乱码,根据经验一般都是手机端和服务器编码不一致,手机端默认UTF-8,之前有同学信誓旦旦说服务器utf-8,最后用gbk2312才解决。所以一定确保手机和服务器编码一致,办法可网上查。

特色及功能
  • 单线程,所有方法都基于一个线程,绝不会跨线程,多线程的事情交给它自带的AsyncExecutor 或者更专业的框架库来解决。
  • 灵活的架构,你可以轻松的替换Json自动化库、参数构建方式甚至默认的apache http client连接方式。
  • 轻量级,微小的的开销,core jar包仅约86kb。
  • 多种请求类型全面支持:get, post, head, put, delete, trace, options, patch.
  • 多文件上传,不需要额外的类库支持。
  • 内置的Dataparser支持文件和位图下载,你也可以自由的扩展DataParser来把原始的http inputstream转化为你想要的东西。
  • 基于json的全自动对象转化: 框架帮你完成Java Object Model 和 Http Parameter之间的转化,完成Http Response与Java Object Model的转化。
  • 自动重定向,基于一定的次数,不会造成死循环。
  • 自动gizp压缩,帮你完成request编码和response解码以使http连接更加快速.
  • 通过网络探测完成智能重试 ,对复杂的、信号不良的的移动网络做特殊的优化。
  • 禁用一种或多种网络, 比如2G,3G。
  • 简明且统一的异常处理体系:清晰、准确的抛出客户端、网络、服务器三种异常。
  • 内置的AsyncExecutor可以让你轻松实现异步和并发的http请求,如果你喜欢,随意使用你自己的AsyncTask或Thread来完成异步,推荐使用更强大、高效的专业并发库( https://github.com/litesuits/android-lite-async )。

下一步计划
  1. 给出上传、下载进度
  2. 加入缓存机制

节操与理念,LiteHttp所坚持的理念:
  1. 坚持性能优先不改变:将不断提升性能
  2. 坚持专一化策略不改变:只做网络连接,精而深
  3. 坚持轻量级策略不改变:加功能的基础上保持最轻量(99K以内)

架构图
一个良好的项目结构:

  • 底层是业务无关的框架库,用之四海而皆准。
  • 中层是针对业务的三方库,以及主要逻辑实现,全部业务都在这里。
  • 上层是Activity、Fragment、Views&Widget等视图渲染和业务调用。
    这样一个结构,使得你的代码快速在phone和pad以及tv之间迁移,且让你整个更为清晰。那么LiteHttp就位于这个结构的底层。

LiteHttp结构模型:


基本用法基础请求
  1. LiteHttpClient client = LiteHttpClient.getInstance(context);
  2. Response res = client.execute(new Request("http://baidu.com"));
  3. String html = res.getString();
复制代码


异步请求
  1. HttpAsyncExcutor asyncExcutor = new HttpAsyncExcutor();
  2. asyncExcutor.execute(client, new Request(url), new HttpResponseHandler() {
  3.         @Override
  4.         protected void onSuccess(Response res, HttpStatus status, NameValuePair[] headers) {
  5.                 // do some thing on UI thread
  6.         }

  7.         @Override
  8.         protected void onFailure(Response res, HttpException e) {
  9.                 // do some thing on UI thread
  10.         }
  11. });
复制代码


Java Model 作为参数的请求
  1. // build a request url as :  http://a.com?name=jame&id=18
  2. Man man = new Man("jame",18);
  3. Response resonse = client.execute(new Request("http://a.com",man));
复制代码
Man:
  1. public class Man implements HttpParam{
  2.                 private String name;
  3.                 private int id;
  4.                 private int age;
  5.                 public Man(String name, int id){
  6.                 this.name = name;
  7.                 this.id= id;
  8.         }
  9. }
复制代码


全自动Json转化
  1. String url = "http://litesuits.github.io/mockdata/user?id=18";
  2. User user = client.get(url, null, User.class);
复制代码

User Class:

  1. public class User extends ApiResult {
  2.         //全部声明public是因为写sample方便,不过这样性能也好,
  3.         //即使private变量LiteHttp也能自动赋值,开发者可自行斟酌修饰符。
  4.         public UserInfo data;

  5.         public static class UserInfo {
  6.                 public String name;
  7.                 public int age;
  8.                 public ArrayList<String> girl_friends;
  9.         }
  10. }

  11. public abstract class ApiResult {
  12.         public String api;
  13.         public String v;
  14.         public Result result;

  15.         public static class Result {
  16.                 public int code;
  17.                 public String message;
  18.         }
  19. }
复制代码

User JSON:

  1. {
  2.         "api": "com.xx.get.userinfo",
  3.         "v": "1.0",
  4.         "result": {
  5.                 "code": 200,
  6.                 "message": "success"
  7.         },
  8.         "data": {
  9.                 "age": 18,
  10.                 "name": "qingtianzhu",
  11.                 "girl_friends": [
  12.                         "xiaoli",
  13.                         "fengjie",
  14.                         "lucy"
  15.                 ]
  16.         }
  17. }
复制代码


多文件上传
  1. String url = "http://192.168.2.108:8080/LiteHttpServer/ReceiveFile";
  2.         FileInputStream fis = new FileInputStream(new File("sdcard/1.jpg"));
  3.         Request req = new Request(url);
  4.         req.setMethod(HttpMethod.Post)
  5.                 .addParam("lite", new File("sdcard/lite.jpg"), "image/jpeg")
  6.                 .addParam("feiq", new File("sdcard/feiq.exe"), "application/octet-stream");
  7.         if (fis != null) req.addParam("meinv", fis, "sm.jpg", "image/jpeg");
  8.         Response res = client.execute(req);
复制代码


文件和位图下载
  1. // one way
  2. File file = client.execute(imageUrl, new FileParser("sdcard/lite.jpg"), HttpMethod.Get);
  3. // other way
  4. Response res = client.execute(new Request(imageUrl).setDataParser(new BitmapParser()));Bitmap bitmap = res.getBitmap();
复制代码

之前有小伙伴反馈的HTTP POST方式穿参现在已经彻底重写,修复。并做了详细测试:

收藏并克隆LiteHttp Github 仓库吧,并且可以看到更多的使用案列,方便你进阶。
Github:https://github.com/litesuits/android-lite-http











点击加入QQ交流群: 47357508

个人开源站点:http://litesuits.com/


EOE兄弟贴:
LiteHttp:极简且智能的 android HTTP 框架库 (专注于网络)

LiteOrm:极简且智能的 android ORM 框架库 (专注数据库)

LiteAsync:强势的 android 异步 框架库 (专注异步与并发)

LiteCommon:丰富通用的android工具类库(专注于基础组件)

其他贴子:

关于java的线程并发和锁的总结

android开发技术经验总结60条

聚划算android客户端1期教训总结

移动互联网产品设计小结

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x

评分

参与人数 8e币 +156 收起 理由
droiddroid + 5 中文乱码,怎么破?
归甲2000 + 1 非常精彩,支持你,加油!
lawen + 8 精彩主题,感谢分享
走正路 + 50 么么哒!
☺大姑爷~(^_^)~ + 50 么么哒!感谢你对eoe的支持

查看全部评分

本帖被以下淘专辑推荐:

签到天数: 5 天

连续签到: 1 天

[LV.2]偶尔看看I

0

主题

24

帖子

143

e币
发表于 2014-8-26 22:15:00 | 显示全部楼层
多文件上传 服务器端怎么接收不同类型的数据?
/**
     * 多文件上传
     */
    private Response makeUpLoadMultiBodyRequest() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(new File("sdcard/安卓问题.txt"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String url11 = "http://192.168.191.1:8080/eltx/Test1";
        Request req = new Request(url11);

        MultipartBody body = new MultipartBody();
        body.addPart(new StringPart("key1", "hello"));
        body.addPart(new StringPart("key2", "很高兴见到你", "utf-8", null));
        body.addPart(new BytesPart("key3", new byte[]{1, 2, 3}));
        body.addPart(new FilePart("pic", new File("sdcard/back.png"), "image/jpeg"));
        body.addPart(new FilePart("song", new File("sdcard/蔡依林-爱情36计.mp3"), "audio/x-mpeg"));
        body.addPart(new InputStreamPart("txt", fis, "安卓问题.txt", "text/xml"));
        req.setMethod(HttpMethod.Post).setHttpBody(body);
        Response res = client.execute(req);
        res.printInfo();
        Log.e("response string :",res.getString());
        //System.out.println("response string : " + res.getString());
        return res;
    }

key1,key2,key3用request.getParamaters(“key1”);接收不到,其他类型的也不会接收。。。求解。。。

该用户从未签到

0

主题

85

帖子

81

e币
发表于 2014-12-29 19:00:19 | 显示全部楼层
String url = "http://192.168.2.108:8080/LiteHttpServer/ReceiveFile";
        FileInputStream fis = new FileInputStream(new File("sdcard/1.jpg"));
        Request req = new Request(url);
        req.setMethod(HttpMethod.Post)
                .addParam("lite", new File("sdcard/lite.jpg"), "image/jpeg")
                .addParam("feiq", new File("sdcard/feiq.exe"), "application/octet-stream");
        if (fis != null) req.addParam("meinv", fis, "sm.jpg", "image/jpeg");
        Response res = client.execute(req);



请问多文件上传中的addParam 这个方法有吗?

点评

你好,这个方法已经过时,并废弃了。请参照最新的demo来做多文件上传吧。  详情 回复 发表于 2014-12-29 22:09

签到天数: 7 天

连续签到: 1 天

[LV.3]偶尔看看II

42

主题

1744

帖子

3904

e币
发表于 2014-3-16 19:14:29 | 显示全部楼层
不错,学习一下

该用户从未签到

22

主题

614

帖子

1168

e币
发表于 2014-3-16 20:23:16 | 显示全部楼层
跟你volley对比,分别有什么优势和缺点,楼主  熟悉么。

点评

使用volley的限制性因素较多。litehttp可能会让你感觉更自由,不受太多约束。  详情 回复 发表于 2014-3-16 20:47

该用户从未签到

4

主题

157

帖子

1352

e币
 楼主| 发表于 2014-3-16 20:47:41 | 显示全部楼层
TCahead 发表于 2014-3-16 20:23
跟你volley对比,分别有什么优势和缺点,楼主  熟悉么。

使用volley的限制性因素较多。litehttp可能会让你感觉更自由,不受太多约束。

该用户从未签到

0

主题

85

帖子

81

e币
发表于 2014-3-16 21:03:40 | 显示全部楼层
哪里有下载,想试一下

点评

谢谢,谢谢,谢谢  详情 回复 发表于 2014-3-16 21:34
https://github.com/litesuits/android-lite-http  详情 回复 发表于 2014-3-16 21:20

该用户从未签到

4

主题

157

帖子

1352

e币
 楼主| 发表于 2014-3-16 21:20:03 | 显示全部楼层
ljpww72729 发表于 2014-3-16 21:03
哪里有下载,想试一下

https://github.com/litesuits/android-lite-http

该用户从未签到

0

主题

85

帖子

81

e币
发表于 2014-3-16 21:34:55 | 显示全部楼层
ljpww72729 发表于 2014-3-16 21:03
哪里有下载,想试一下

谢谢,谢谢,谢谢

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

12

主题

1231

帖子

7787

e币
发表于 2014-3-16 21:35:05 | 显示全部楼层
收藏下,学习学习

该用户从未签到

0

主题

430

帖子

398

e币
发表于 2014-3-17 08:38:12 | 显示全部楼层

收藏下,学习学习

该用户从未签到

0

主题

105

帖子

14

e币
发表于 2014-3-17 08:59:48 来自手机 | 显示全部楼层
很不错的技术哦,学习了

签到天数: 201 天

连续签到: 6 天

[LV.7]常住居民III

10

主题

1470

帖子

6767

e币
发表于 2014-3-17 09:06:57 | 显示全部楼层
有时间再看下吧,只是不知道是不是有需要的模块。

签到天数: 6 天

连续签到: 1 天

[LV.2]偶尔看看I

23

主题

1478

帖子

1万

e币
发表于 2014-3-17 09:19:00 | 显示全部楼层
这个是基于apache http client 吗??

点评

恩,是的,你也可以自己替换为httpurlconnection实现的  详情 回复 发表于 2014-3-17 13:07

签到天数: 108 天

连续签到: 1 天

[LV.6]常住居民II

22

主题

1507

帖子

6623

e币
发表于 2014-3-17 09:22:32 | 显示全部楼层
框架楼主自己写的还是?

点评

是自己写的。~~~~~~  详情 回复 发表于 2014-3-17 13:09

签到天数: 39 天

连续签到: 1 天

[LV.5]常住居民I

5

主题

832

帖子

3244

e币
社区认证会员 QQ认证
发表于 2014-3-17 09:23:19 | 显示全部楼层
本帖最后由 逍遥§№无风 于 2014-3-17 09:42 编辑

volley也没什么限制因素啊。。我觉得和这个用法差不多。。不过这个框架多了一个JSON解析过程。参数传递直接用javabean还是很方便的一个方面。下载看了下。。全中文。。是自己写的框架么?

点评

我对volley不很了解哎,有几点请教吧: 它可以替换连接层实现方式么, 可以自定义参数构造么, 可以用自己的方式加入更强的的并发连接机制吗? 可以自己写读取数据的方式吧? 不过我听说它在生命周期做了关联,图片  详情 回复 发表于 2014-3-17 13:19
我对volley不很了解哎,我不知道它可以替换连接层实现方式么,可以自定义参数构造么,可以用自己的方式加入更强的的并发连接机制吗?可以自己写读取数据的方式吧?不过我听说它在生命周期做了关联,图片的缓存也做了  详情 回复 发表于 2014-3-17 13:14

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

48

主题

322

帖子

446

e币
发表于 2014-3-17 10:55:53 | 显示全部楼层
不错的东西,先回复,然后下载下来学习一下
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2018-1-21 20:23 , Processed in 0.589652 second(s), 57 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信