[关闭]
@liter 2015-11-09T02:56:13.000000Z 字数 2626 阅读 4341

Android网络通信框架LiteHttp 第三节:自动对象转化

litehttp2.x版本系列教程


官网: http://litesuits.com

QQ群: 大群 47357508,二群 42960650

本系列文章面向android开发者,展示开源网络通信框架LiteHttp的主要用法,并讲解其关键功能的运作原理,同时传达了一些框架作者在日常开发中的一些最佳实践和经验。

本系列文章目录总览: https://zybuluo.com/liter/note/186513


第三节:LiteHttp之自动对象转化

下面是一个真实有效的API地址:

  1. public static final String userUrl = "http://litesuits.com/mockdata/user_get";

它的响应体是个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. java对象转为http参数

假设是一个GET请求,就是说将参数拼接在URL里,类似:http://{userUrl}?id=168&key=md5,自动拼接参数的示范代码如下:

  1. /**
  2. * Param Model: will be converted to: http://...?id=168&key=md5
  3. */
  4. class UserParam implements HttpParamModel {
  5. // static final property will be ignored.
  6. private static final long serialVersionUID = 123L;
  7. private long id;
  8. public String key;
  9. @NonHttpParam
  10. protected String ignored = "Ignored by @NonHttpParam ";
  11. public UserParam(long id, String key) {
  12. this.id = id;
  13. this.key = key;
  14. }
  15. }
  16. // build as http://{userUrl}?id=168&key=md5
  17. liteHttp.executeAsync(new StringRequest(userUrl, new UserParam(18, "md5"))
  18. .setHttpListener(new HttpListener<String>() {
  19. @Override
  20. public void onSuccess(String data, Response<String> response) {
  21. Log.i(TAG, "USER: " + data);
  22. }
  23. }));

上面示范了将UserParam对象转化为URL参数,并得到String响应的方式,注意:

2. json string转为java对象

  1. /**
  2. * Request Model : json string translate to user object
  3. */
  4. class UserRequest extends JsonAbsRequest<User> {
  5. public UserRequest(String url, HttpParamModel param) {
  6. super(url, param);
  7. }
  8. }
  9. // build as http://{userUrl}?id=168&key=md5
  10. UserRequest userRequest = new UserRequest(userUrl, new UserParam(18, "md5"));
  11. userRequest.setHttpListener(new HttpListener<User>() {
  12. @Override
  13. public void onSuccess(User user, Response<User> response) {
  14. // data has been translated to user object
  15. }
  16. });
  17. liteHttp.executeAsync(userRequest);

上面示范了将UserParam对象转化为URL参数,并直接得到User响应对象的方式,注意:

  1. User user = liteHttp.executeAsync(new JsonAbsRequest<User>(userUrl) {});
  1. /**
  2. * base model
  3. */
  4. public abstract class BaseModel implements Serializable {
  5. }
  6. /**
  7. * api model: base structure
  8. */
  9. public class ApiModel<T> extends BaseModel {
  10. /**
  11. * 不变的部分:写在API基类中
  12. */
  13. private String api;
  14. private String v;
  15. protected int code;
  16. protected String message;
  17. /**
  18. * 变化的部分:使用泛型,数据类型的确认延迟到子类里。
  19. */
  20. protected T data;
  21. // getter setter toString 等方法已删减掉...
  22. }
  23. /**
  24. * response string will be converted to this model
  25. */
  26. public class User extends ApiModel<User.Data> {
  27. // 泛型设置:定义一个公共静态内部类(也可以定义外部类)
  28. public static class Data extends BaseModel{
  29. public int age;
  30. public String name;
  31. public ArrayList<String> girl_friends;
  32. // getter setter toString 等方法已删减掉...
  33. }
  34. }

Model Parameter String 之间的转化比较灵活,请各位玩家多看源码和案例,依据实际需求,挖掘更多玩法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注