Retrofit + GSON处理JSON模板

动机

  • 首先封装了Retrofit的一些操作,也就是回调的时候不必去为每个javabean的每个操作去写一个Callback,所有的bean公用一个Callback
  • 使用了MVP的设计思想,加上公用的Callback,使得每个bean的Presenter层只需要极少的方法,就可以实现原来的功能。
  • 然后封装GSON,定义了公用的Holder容器,存储从服务器直接返回的JSON数据,然后分发给每个bean类。

当然上面所有的前提都是一个:服务器返回的JSON数据是按照一定的格式的。

API返回的数据格式:

由于服务器是自己写的所以格式可以自己定啦 ,所以本文所说的就是这样的一个格式,所有的解析都会用一个模板,把所有的公共代码向父类重构,大大减少的代码的数量,使得子类更加简单,这就是我的目的。

{
    "Msg": "OK",
    "Code": 100,
    "Result":[] //这里是一个数组
}

或者

{
    "Msg": "Error",
    "Code": 111,
}

然后前面一个是请求成功的结果,后面一个是请求失败的结果,由于这是一个模板,所以Result是对应多个对象(POJO).
下面是一个请求成功返回的例子:

{
  "Msg": "OK",
  "Code": 100,
  "Result": [
    {
      "createdAt": "2016-03-23 01:17:36",
      "times": 0,
      "tagId": 1,
      "id": 1,
      "title": "[Java GC]Algorithm For GC",
      "type": "原创",
      "tagName": "Java",
      "content": "Content"
    }
  ]
}

Retrofit的使用

对于Retrofit的基本使用这里就不再赘述。
首先我们定义请求的模板:

public interface BlogAPI {
   

    @GET("blog/queryById")
    Call<ResponseBody> queryById(@Query("id") int id);

    @GET("blog/queryByTitle")
    Call<ResponseBody> queryByTitle(@Query("title") String title);

    @GET("blog/queryByTag")
    Call<ResponseBody> queryByTag(@Query("tag") String tag);

    @GET("blog/queryByTime")
    Call<ResponseBody> queryByTime(@Query("time") String time);

    @GET("blog/queryByType")
    Call<ResponseBody> queryByType(@Query("type") String type);

    //Request to BlogController#index() in server
    @GET("blog")
    Call<ResponseBody> queryAll(@Query("pageNum") int pageNum);
}

所有的Call<>里面的泛型都是ResponseBody,那么什么是ResponseBody呢??为什么要用这个呢??

A one-shot stream from the origin server to the client application with the raw bytes of the response body. Each response body is supported by an active connection to the webserver. This imposes both obligations and limits on the client application.

从服务器返回的一次性的字节流,是从服务返回的原始数据,这意味着客户端必须做一些解析工作。同时这个流在使用之后必须关闭,就像InputStream一样。基于上述原,我们选择了这个(其实也可以在Call里面直接放上javabean,然后每个javabean里面有CodeMsg属性,但是我觉得这样不合理,违反了类的单一职责的原则)

下面定义一个Manager用来处理Retrofit

/**
 * Created by WQH on 2016/4/16  19:13.
 */
public class RemoteManager {
   

    public static final String DOMAIN = "http://wangqihang.cn:8080/Blog/";
    public static final int OK = 100; // Request OK.
    public static final int PARSE = 109
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值