基于 okhttp 封装网络库 (2)

来源:互联网 发布:新一代人工智能规划 编辑:程序博客网 时间:2024/06/07 01:57

基于okhttp封装网络库 (2)

前言:上篇只是封装了一个基础的抽象类,假设我们需要发送一个 json 请求,那么该如何对 BaseRequest 扩展呢?

第一步:确定 MediaType 并解析

    //该函数在 okhttp3.MediaType 包下    public static final MediaType Media_Json = MediaType.parse("application/json; charset=utf-8");    //BaseRequest 中的抽象方法    public MediaType getMediaType() {        return Media_Json;    }

第二步,将 bodyMap 解析成 Json格式

    protected String getRequestString() {        if (mBodyMap != null && mBodyMap.size() > 0) {            try {                // fastjson 这个库已经为我们封装好将 bodymap 解析成 json的 api,我们直接调用即可。                String json = JSON.toJSONString(mBodyMap, SerializerFeature.WriteNullStringAsEmpty);                return json.toString();            } catch (Exception e) {                e.printStackTrace();            }        }        return null;    }

结果:JsonRequest

public abstract class JSONRequest<T> extends BaseRequest<T> {    public static final MediaType Media_Json = MediaType.parse("application/json; charset=utf-8");    public JSONRequest(  ) {        super( );    }    public MediaType getMediaType() {        return Media_Json;    }    protected String getRequestString() {        if (mBodyMap != null && mBodyMap.size() > 0) {            try {                String json = JSON.toJSONString(mBodyMap, SerializerFeature.WriteNullStringAsEmpty);                return json.toString();            } catch (Exception e) {                e.printStackTrace();            }        }        return null;    }}

上面只是针对 POST 请求方式的 主体内容格式的封装,下面才真正开始写一个能供业务层调用的请求类 JsonReQuestTask 。思路也很简单,就是完成基础抽象类抽象方法即可,原理在上篇的开篇讲到。

public class JsonReQuestTask extends JSONRequest {    public BookDetailTask() {        super();    }    @Override    public String getApi() {        return "/api";    }    @Override    public int getHttpMethod() {        return HttpMethod.POST;    }    @Override    public Class getModelClass() {        return Bean.class;    }

扩展:表单请求 FormRequest

public abstract class FormRequest<T> extends BaseRequest<T> {    public static final MediaType Media_FORM = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");    public FormRequest() {        super();    }    public MediaType getMediaType() {        return Media_FORM;    }    protected String getRequestString() {        if (mBodyMap != null && mBodyMap.size() > 0) {            try {                String json = encodeParameters(mBodyMap, "utf-8");                return json.toString();            } catch (Exception e) {                e.printStackTrace();            }        }        return "";    }}

扩展:文件上传 MultiPartRequest

public abstract class MultiPartRequest<T> extends FormRequest<T> {    public static final MediaType Media_PART = MediaType.parse("multipart/form-data; charset=utf-8");    protected List<File> mFiles = new ArrayList<File>();    public MultiPartRequest() {        super();    }    public MediaType getMediaType() {        return Media_PART;    }    protected Request buildRequest() {        RequestBody body = null;        Request.Builder builder = new Request.Builder();        switch (getHttpMethod()) {            case HttpMethod.GET:                //TODO 抛出异常,一般不用 GET做上传。                break;            case HttpMethod.POST:                MultipartBody.Builder bodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);                for (File file : mFiles) {                    if (file.exists()) {                        RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);                        bodyBuilder.addFormDataPart("file", file.getName(), requestBody);                    }                }                for (Map.Entry<String, String> entry : mBodyMap.entrySet()) {                    if (TextUtils.isEmpty(entry.getKey()) || TextUtils.isEmpty(entry.getValue())) {                        continue;                    }                    bodyBuilder.addFormDataPart(entry.getKey(), entry.getValue());                }                body = bodyBuilder.build();                builder.url(getUrl()).post(body);                break;            default:                //TODO                break;        }        return builder.build();    }}

总结:可见其实对于 Json 格式封装其实也不难,只要思路清晰一步一步来就行,下篇就来实际操作一遍对豆瓣的图书请求吧!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子身上起红疙瘩很痒怎么办 久而不射,但软了怎么办 盆底综合肌力1级怎么办 头发掉的厉害怎么办吃什么好 给蜂蛰了肿了痒怎么办 小米手环2没电了怎么办 小米手环2不亮了怎么办 红米3s无限重启怎么办 乐视手机1s卡顿怎么办 老公出轨了怎么办你会选择离婚吗 c盘和d盘换换了怎么办 晚上2点到3点醒怎么办 红米3s变砖了怎么办 6s锁屏密码忘了怎么办 怀孕9个月了胃疼怎么办 怀孕6个月了胃疼怎么办 孕妇胃疼怎么办4个月了 25岁欠了5万块钱怎么办 感冒嗓子疼怎么办最简单的方法 和老婆离婚了我的心好痛怎么办 4s店不给退定金怎么办 教你闪腰了后该怎么办 coolpad酷派手机开不了机怎么办 苹果5s黑屏开不了机怎么办 苹果4s的屏坏了怎么办 苹果6手机充电口接触不良怎么办 5s用久了卡顿怎么办 孕妇血糖高怎么办什么方法降最好 脚砸了肿了紫了怎么办 我想在淘宝上卖东西该怎么办 苹果手机4s开不了机怎么办 冒险岛s前出2条怎么办 狗狗又吐又拉血怎么办 小孩上网成瘾怎么办父母要怎么做 一只眼睛大一只眼睛小怎么办 带近视镜时间长了眼睛变形怎么办 联通卡2g换4g卡怎么办 上火牙疼怎么办教你立刻止疼 吃热的凉的牙疼怎么办 我买的股票退市了怎么办 如果起诉离婚另一方不出庭怎么办