版权声明:本文为博主原创文章,未经博主允许不得转载。
前几天,我们又开始在做一个新项目,由于是一个外包项目,后台是一群php,这出现了一个问题,我们之前的请求方式,发生了变化,直接去请求,php接不到我们所传递的数据。
于是,就进行了折腾,怕后面忘记,将它记录下来,也算是明白了到底,这其中,有什么区别。一般get方式请求都不会有问题,但是get还是有区别的。
1.get请求
@GET("/users/{username}")
void getUser(@Path("username") String username);
这种放式,就是将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")
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")
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后面的时间戳和一些后台规定的字段。
完