记Retrofit 2的请求与数据直转

版权声明:本文为博主原创文章,未经博主允许不得转载。

前几天,我们又开始在做一个新项目,由于是一个外包项目,后台是一群php,这出现了一个问题,我们之前的请求方式,发生了变化,直接去请求,php接不到我们所传递的数据。

于是,就进行了折腾,怕后面忘记,将它记录下来,也算是明白了到底,这其中,有什么区别。一般get方式请求都不会有问题,但是get还是有区别的。

1.get请求

    @GET("/users/{username}")
    void getUser(@Path("username") String username);   //get累加url的键值对

这种放式,就是将username填到{usernme}当中,最终的组成的就是这样的“http:*/users/xiaozhang”

@GET("/api/Base/SysBase/ToLogin")
    Observable<HttpResult> getUsersBySort(@Query("name") String name,@Query("password") String password);

而这个,实际就是后台需要我们传递的两个参数,最终拼成的是”http://*/api/Base/sysBase/ToLogin?name=xiaozhang&&password=123456,他只是适合比较少的参数,比较多的,就需要使用下面这种方式。

@GET("http://checw.023bl.cn/Api/test/")
    Observable<HttpResult> testget(@QueryMap Map<String, String> urlPostFix);//get累加的多个健值队   给一个Map

用一个map,将要传递的所有参数,放在这个其中。

  Map<String, String> urlPostFix = new HashMap<>();
        urlPostFix.put("name", "xiaozhang");
        urlPostFix.put("password", "123456");
        subscription = NetWork.createApi(GetApi.class).testget(urlPostFix).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<HttpResult>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("test", "首页版本检测获取的结果的错误原因:" + e);
                    }

                    @Override
                    public void onNext(HttpResult pageBean) {
                        Log.i("test", "首页版本检测获取的结果:" + pageBean.ResultJson);

                    }

                });
        compositeSubscription.add(subscription);

他最终也是,http://*/api/Base/sysBase/ToLogin?name=xiaozhang&&password=123456这样的。

2.post请求

psot请求,是放在一个表单当中的,他就不是累加在url后面了。

单个键值队:

 @POST("http://checw.023bl.cn/Api/test/")
    @FormUrlEncoded    
    Observable<HttpResult> testpost(@Field("id") String idvalue,@Field("categoryid") String categoryidvalue);     //单个键值队

多个健值队 给一个Map:

@POST("http://checw.023bl.cn/Api/test/")
    @FormUrlEncoded
    Observable<HttpResult> testpost(@FieldMap Map<String, String> postMap); //多个健值队  给一个Map

值得说一下的就是,向这种情况,我们要学会区分。

这里写图片描述

他需要的是一个data,而其中的一些传值,都是一个json数据。只是将他放在,data这个字段当中。data=“{“ID”:”4”,”JuLi”:”5002.0”,”Name”:”重庆市”}”

字段虽然对不上,也是.net语言,但是大致意思是这样。它的接口是这样的。

 @POST("http://checw.023bl.cn/Api/test/")
    @FormUrlEncoded     
    Observable<HttpResult> testpost(@Field("data") String idvalue);     //单个键值队
-----------------------------------------------
        JSONObject postData = new JSONObject();
        try {
            postData.put("Is_Recommend", "true");//是否首页是:true;否:false
            postData.put("pageIndex", "1");//页码
            postData.put("pageSize", "10");//页面大小

            Log.i("mainFragment", "mainfragmen活动接口传递的参数:" + postData.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        subscription = NetWork.createApi(GetApi.class).MainFg_GetActivity(postData.toString())
                .compose(RxUtils.<HttpResult<PageResult<ActivityEntity>>>defaultSchedulers())
                .subscribe(new RxSubscribe<HttpResult<PageResult<ActivityEntity>>>() {
                    @Override
                    protected void _onSuccess(HttpResult<PageResult<ActivityEntity>> httpResult) {
                        Log.i("mainFragment", "mainfragmen活动获取的数据结果:" + new Gson().toJson(httpResult.ResultJson));
                        if (httpResult.Code) {
                            if (httpResult.ResultJson.data.size() == 0) {
                                adapter.removeHeaderView(activityView);
                            } else {
                                activity_adapter.getDatas().addAll(httpResult.ResultJson.data);
                                activity_adapter.notifyDataSetChanged();
                            }
                        }

                    }

                    @Override
                    protected void _onError(String message) {
                        Log.i("mainFragment", "mainfragmen活动获取的结果的错误原因:" + message);
                    }
                });
        compositeSubscription.add(subscription);

这里写图片描述

而这个就直接用上面的,就行了。

 @POST("http://checw.023bl.cn/Api/test/")
    @FormUrlEncoded    
    Observable<HttpResult> testpost(@Field("id") String idvalue,@Field("categoryid") String categoryidvalue);     //单个键值队

3.数据直转

Retrofit 2和Rxjava结合,好处之一,在我看来,就是数据直转,如果你的后台给你的是这样的数据,

服务器获取的结果:{"Code":true,"Message":"请求成功!","ResultJson":{"data":[{"lifeid":3,"title":"兰溪公司(重庆王家镇店)优惠酬宾","isrecommend":true,"cateid":31,"cityid":4,"areaid":12,"businessid":0,"userid":6,"isshop":true,"text1":"保养打折","text2":"","text3":"","num1":0,"num2":0,"select1":982,"select2":0,"select3":0,"select4":0,"select5":0,"urgentdate":"0001-01-01T00:00:00","topdate":"2016-08-02T00:00:00","photo":"http://www.carcai.cn/attachs/2016/08/02/thumb_57a0370a03d09.jpg","contact":"王喜","mobile":"15888888888","qq":"45678564","addr":"重庆王家镇店","views":45,"createtime":0,"createip":"125.84.182.154","lasttime":1472709172,"audit":true,"lng":"106.706088","lat":"29.777261"},{"lifeid":1,"title":"维护保养大优惠","isrecommend":true,"cateid":31,"cityid":4,"areaid":11,"businessid":0,"userid":2,"isshop":true,"text1":"蓝韵车行(大竹林店) 9月初到10月的优惠活动","text2":"","text3":"","num1":0,"num2":0,"select1":982,"select2":0,"select3":0,"select4":0,"select5":0,"urgentdate":"0001-01-01T00:00:00","topdate":"2016-07-19T00:00:00","photo":"http://www.carcai.cn/attachs/2016/07/28/thumb_579a025d5b8d8.jpg","contact":"王中无","mobile":"15822222222","qq":"15645342","addr":"驻马店","views":44,"createtime":0,"createip":"125.84.181.26","lasttime":1471489550,"audit":true,"lng":"106.533863","lat":"29.63031"}],"total":0}}

那么恭喜你,你可以用它。可以看见上面的ResultJson字段的数据是一个json对象,那么这段数据,抽出的模板就是{Code,Message,ResultJson},ResultJson={data,total},data={title,photo,**},他在接口中就可以这样用下面的方式。


  @POST("http://checw.023bl.cn/Api/test/")
    @FormUrlEncoded
    Observable<HttpResult<PageResult<ActivityEntity>>> testpost(@FieldMap Map<String, String> postData); //多个健值队  给一个Map

实体模板

/**
 * Created by zhang on 2016/6/2.
 * 接口解析第一层包
 */
public class HttpResult<T> implements Serializable {
    /**ֵ状态值:ture/false **/
    public boolean Code;
    /** 错误时的消息类型 **/
    public String Message;
    /** 返回json字符串结果 **/
    public T ResultJson;
}
/**
 * Created by zhang on 2016/6/2.
 * 接口解析第二层包
 */
public class PageResult<T> {

    /**
     * 数据总条数
     **/
    public int total;

    /**
     * 数据结果集
     **/
    public List<T> data;

}
public class ActivityEntity {

    private String lifeid;
    private String title;//标题
    private String cateid;
    private String cityid;
    private String areaid;
    private String text1;
    private String photo;//图片
    private String contact;//联系人
    private String mobile;//手机号码
    private String addr;//地址
    private String lng;//经度
    private String lat;//纬度
    ----------------------------------------
    get和set方法。
}

取就很简单了。

 JSONObject postData = new JSONObject();
        try {
            postData.put("Is_Recommend", "true");//是否首页是:true;否:false
            postData.put("pageIndex", "1");//页码
            postData.put("pageSize", "10");//页面大小

            Log.i("mainFragment", "mainfragmen活动接口传递的参数:" + postData.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        subscription = NetWork.createApi(GetApi.class).MainFg_GetActivity(postData.toString())
                .compose(RxUtils.<HttpResult<PageResult<ActivityEntity>>>defaultSchedulers())
                .subscribe(new RxSubscribe<HttpResult<PageResult<ActivityEntity>>>() {
                    @Override
                    protected void _onSuccess(HttpResult<PageResult<ActivityEntity>> httpResult) {
                        Log.i("mainFragment", "mainfragmen活动获取的数据结果:" + new Gson().toJson(httpResult.ResultJson));
                        if (httpResult.Code) {
                            if (httpResult.ResultJson.data.size() == 0) {
                                adapter.removeHeaderView(activityView);
                            } else {
                                activity_adapter.getDatas().addAll(httpResult.ResultJson.data);
                                activity_adapter.notifyDataSetChanged();
                            }
                        }

                    }

                    @Override
                    protected void _onError(String message) {
                        Log.i("mainFragment", "mainfragmen活动获取的结果的错误原因:" + message);
                    }
                });
        compositeSubscription.add(subscription);

至于post直接传值json数据,我以前是这样的。

 //验证码登陆
    @POST("api/Member/LoginAndRegist/ValidCodeLogin")
    Observable<***> CodeLogin(@QueryMap Map<String, String> urlPostFix, @Body String data);

@QueryMap 是累加在url后面的时间戳和一些后台规定的字段。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣•厚德载物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值