提前声明这个实践是在Retrofit2+rxjava下是用的,不是使用call,而是用的observable,原理一样希望能帮助到你
前几天学Retrofit,正好有人遇见从自己项目的老框架转换成Retrofit事,对于习惯使用post传递键值对的我来说,突然发还有一部分传参数是"Content-Type: application/json;charset=UTF-8"的接口,这是什么鬼,Retrofit怎么调用。,然后自己查看了网上文章发现这个@Body的注解,写一下@Body的使用。
body可以使用两种方式一种是这样直接传递java对象这个对象是能够被gson解析成json字符串的,另一种是传递RequestBody对象,其实不管是那种方式最后传出去的参数都是json格式的
第一种传对象
/** * Created by 淼素 on 2016/11/11 0011. */ public interface Api {// @FormUrlEncoded 我的项目还有键值对的接口,我没在乎直接用了,发现崩溃了,一直以为是自己写错了,结果屏蔽了这个就ok了。。
// @POST() // Observable<Main_bean> listRepos(@Url String url,@FieldMap Map<String, String> params);@POST("login.jhtml")@Headers({ "Content-Type: application/json;charset=UTF-8"})Observable<bean> addUser(@Body Login_user body);}
调用
Retrofit retrofit = new Retrofit.Builder() .baseUrl(MySettings.REQUESTURI) //主url .addConverterFactory(GsonConverterFactory.create())//gson解析 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//rxjava .build(); Api api =retrofit.create(Api.class); Observable<bean> observable= api.addUser(url,Login_userd对象 ); observable.subscribeOn(Schedulers.io()) //访问接口时的线程 .unsubscribeOn(AndroidSchedulers.mainThread()) //链接开始前和异常结束的线程选择 .observeOn(AndroidSchedulers.mainThread()) //获取到数据时的线程 .subscribe(new Subscriber(){ });
第二种直接传字符串
/** * Created by 淼素 on 2016/11/11 0011. */ public interface Api { @POST("login.jhtml") @Headers({ "Content-Type: application/json;charset=UTF-8"}) Observable<bean> addUser(@Body RequestBody body); }RequestBody对象的创建
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"你要传递的json字符串");
调用
Retrofit retrofit = new Retrofit.Builder() .baseUrl(MySettings.REQUESTURI) //主url .addConverterFactory(GsonConverterFactory.create())//gson解析 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//rxjava .build(); Api api =retrofit.create(Api.class); Observable<bean> observable= api.addUser(url,RequestBody 对象 ); observable.subscribeOn(Schedulers.io()) //访问接口时的线程 .unsubscribeOn(AndroidSchedulers.mainThread()) //链接开始前和异常结束的线程选择 .observeOn(AndroidSchedulers.mainThread()) //获取到数据时的线程 .subscribe(new Subscriber(){ });
调用可以看这篇封装之后的,会很方便
http://blog.csdn.net/qq_21174855/article/details/53259497
技术一般希望大家提出自己的意见.