基于 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
- 基于 okhttp 封装网络库 (2)
- 基于okhttp封装网络库 (1)
- 基于okhttp封装网络库 (3)
- 基于Retrofit2+OkHttp封装的Android网络操作库RetrofitClient
- Android okHttp封装库(2) -- okhttp-OkGo
- 基于HttpURLConnection的简单网络请求框架(开源),包含okhttp封装
- 基于Retrofit、OkHttp、Gson封装通用网络框架
- 基于Retrofit、OkHttp、Gson封装通用网络框架
- 基于Retrofit、OkHttp、Gson封装通用网络框架
- 二次封装OKHttp网络框架(1)
- 二次封装OKHttp网络框架(1)
- OKHttp封装(带泛型)网络判断
- OKHttp网络请求封装
- Android 底层封装之基于Rxjava与Okhttp网络请求封装(1)
- 基于okhttp的简单封装
- 基于OKhttp的MVP封装
- Okhttp封装、网络层扩展
- Okhttp 简单的网络封装
- jsp页面乱码
- C# 处理word IOException
- Linux下用户组、文件权限详解
- Android File存储
- MongoDB的权限控制
- 基于 okhttp 封装网络库 (2)
- “认知安全”是怎样一种安全?
- 设计模式-命令模式
- ionic打包apk报错问题A problem occurred configuring root project 'android'.
- Logstash
- org.apache.hadoop.io.nativeio.NativeIO$Windows.access0
- Android 无限循环ViewPager滑动空白Bug及报错跳坑
- 关于UDP和TCP通讯的介绍
- hash算法详解和hash冲突碰撞解决