您的位置:首页 > Web前端 > JavaScript

Retrofit2提交JSON格式的数据

2016-12-06 01:56 344 查看
  为了跟上Android开发的技术潮流,最近在研究Retrofit。自己也尝试在此基础上封装适合自己的网络请求框架。工作的项目中所有请求都约定为POST并且请求参数和响应结果都是JSON格式的。于是开始搜索“Retrofit提交JSON“,得到的结果和Retrofit的官方简介上推荐的一样的。那就是把请求封装成bean,然后使用@Body来发送这个请求。代码如下

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官方入门教程虽不能教你实现自己的封装,但是对普通的使用有很好的示例作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  retrofit post json