Retrofit2提交JSON格式的数据
2016-12-06 01:56
344 查看
为了跟上Android开发的技术潮流,最近在研究Retrofit。自己也尝试在此基础上封装适合自己的网络请求框架。工作的项目中所有请求都约定为POST并且请求参数和响应结果都是JSON格式的。于是开始搜索“Retrofit提交JSON“,得到的结果和Retrofit的官方简介上推荐的一样的。那就是把请求封装成bean,然后使用@Body来发送这个请求。代码如下
上述代码的掣肘显而易见,那就是需要为每个请求都封装一个bean。使用这种方式的博友们还专门提供了自动生成这样的bean的工具类,可谓良苦用心。Java Web开发中也许习惯以bean作为查询条件,每张数据库表对应一个bean,很容易获得。即使bean中很多字段根本用不到,但是简单粗暴将整个bean传过去作为参数,使用起来非常方便。而以移动端的开发习惯,我们并不会为每个request封装一个特定的bean。而只会为每个response封装一个bean或者叫model,用于反序列化响应结果。
下面看看Retrofit提交JSON的正确姿势。
这里的@HeaderMap是添加动态请求头用的,比如cookie。不需要的可以去掉headers这个参数。
如果对你有帮助,这是生成代理对象的代码
以及实际使用的代码
所有源码可以在这里查看Retrofit浅封装
本文受启发于Retrofit 2 — How to Send Plain Text Request Body, 在此表示感谢。Retrofit官方入门教程虽不能教你实现自己的封装,但是对普通的使用有很好的示例作用。
public interface TaskService { @POST("/tasks") Call<Task> createTask(@Body Task task); }
public class Task { private long id; private String text; public Task(long id, String text) { this.id = id; this.text = text; } }
Task task = new Task(1, "my task title"); Call<Task> call = taskService.createTask(task); call.enqueue(new Callback<Task>() {});
上述代码的掣肘显而易见,那就是需要为每个请求都封装一个bean。使用这种方式的博友们还专门提供了自动生成这样的bean的工具类,可谓良苦用心。Java Web开发中也许习惯以bean作为查询条件,每张数据库表对应一个bean,很容易获得。即使bean中很多字段根本用不到,但是简单粗暴将整个bean传过去作为参数,使用起来非常方便。而以移动端的开发习惯,我们并不会为每个request封装一个特定的bean。而只会为每个response封装一个bean或者叫model,用于反序列化响应结果。
下面看看Retrofit提交JSON的正确姿势。
//定义接口 public interface ApiService { /** * request和response都是json形式,不使用系统默认的GsonConverter,拿到response后自己用Gson解析成bean */ @POST Call<ResponseBody> postWithJson(@Url String url, @HeaderMap Map<String, String> headers, @Body RequestBody paramBody); }
这里的@HeaderMap是添加动态请求头用的,比如cookie。不需要的可以去掉headers这个参数。
//封装 @Override public Call<ResponseBody> generateCall() { RequestBody paramBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), mParamStr);//将参数包装成RequestBody return HttpRequest.sApiService.postWithJson(mUrl, mHeaderMap, paramBody); }
mCall = mBuilder.generateCall(); mCall.enqueue(callback);
如果对你有帮助,这是生成代理对象的代码
public class ServiceGenerator { private static OkHttpClient.Builder okHttpclientBuilder; private static Retrofit.Builder retrofitBuilder; public static <S> S createService(Class<S> serviceClass) { okHttpclientBuilder = new OkHttpClient.Builder(); //目前封装的几个接口都是没有用到GsonConverter,是传入ResponseBody,拿到响应结果后自己解析 retrofitBuilder = new Retrofit.Builder() .baseUrl(Config.baseUrl) /*.addConverterFactory(GsonConverterFactory.create())*/; Retrofit retrofit = retrofitBuilder.client(okHttpclientBuilder.build()).build(); return retrofit.create(serviceClass); } }
public static ApiService sApiService = ServiceGenerator.createService(ApiService.class);
以及实际使用的代码
HttpRequest.builder( new PostJsonBuilder() .url(ApiUrl.LOGIN) .defaultHeaders() .param("mobile", "13*********") .param("password", Md5.md5Toword("123456")) .modelClazz(LoginModel.class) .callback(new AbsCallback<LoginModel>() { @Override public void onBizSuccessOnUi(LoginModel model) { UserInfo info = model.getData(); ToastUtils.showShort("登录成功"); mBtnLogin.setText("登录成功"); } @Override public void onBizFailureOnUi(LoginModel model) { ToastUtils.showShort("登录失败"); } })).startCall();
所有源码可以在这里查看Retrofit浅封装
本文受启发于Retrofit 2 — How to Send Plain Text Request Body, 在此表示感谢。Retrofit官方入门教程虽不能教你实现自己的封装,但是对普通的使用有很好的示例作用。
相关文章推荐
- Android如何通过Retrofit提交Json格式数据
- 如何通过Retrofit提交Json格式数据
- 如何通过Retrofit提交Json格式数据
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及非文件上传的部分
- ajax 提交 json格式数据到后台
- extjs Post方法提交json格式的数据到php
- 深入分析JSON编码格式提交表单数据
- PHP 使用 curl 提交 json 格式数据
- JSON编码格式提交表单数据详解
- 创建,提交,查询的来去Json数据格式
- JSON编码格式提交表单数据详解
- Ajax提交json格式数据
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及文件上传的部分
- asp.net服务器处理浏览器提交json格式的数据
- 深入分析JSON编码格式提交表单数据
- extjs Post方法提交json格式的数据到php
- json数据与JAVA数据的转换 jsonJavaBean.netApache 自己编写了一个工具类,处理页面提交json格式数据到后台,再进行处理成JAVA对象数据 1、DTO:Data T
- Restful POST请求提交json或www-form-urlencoded数据格式的选择
- PHP 使用 curl 提交 json 格式数据(已实践 可行)
- JSON编码格式提交表单数据详解