retrofit的post请求。
aaaaaaa.jpg
这个界面,瀑布流的数据,是一个post请求,且请求回来的数据不明确。
首先得把请求的数据拿到,才能写出javabean。
请求的url是'https://m.ctrip.com/restapi/soa2/16189/json/searchTripShootListForHomePageV2?_fxpcqlniredt=09031014111431397988&__gw_appid=99999999&__gw_ver=1.0&__gw_from=10650013707&__gw_platform=H5';
post提交的是json数据:
var Params = {
"districtId": -1,
"groupChannelCode": "RX-OMF",
"type": null,
"lat": -180,
"lon": -180,
"locatedDistrictId": 0,
"pagePara": {
"pageIndex": 1,
"pageSize": 10,
"sortType": 9,
"sortDirection": 0
},
"imageCutType": 1,
"head":
{'cid': "09031014111431397988"},
"contentType": "json"
};
(数据是来自flutter那边的)
首先,要考虑2个问题。
第一个问题是,这个url,是一个全新的url,和之前初始化retrofit时候的
url头部完全不一样。这时候,需要使用动态URL。
在GET和POST的时候,不加url节点,改为在方法括号里加url就行了。
public interface UserService {
@GET
public Call<ResponseBody> profilePicture(@Url String url);
}
这样,url会使用括号里的。
第二个问题,如何post提交josn数据。
方法:getMessage(@Body RequestBody info)。
具体操作如下:
String TRAVEL_URL = "https://m.ctrip.com/restapi/soa2/16189/json/searchTripShootListForHomePageV2?_fxpcqlniredt=09031014111431397988&__gw_appid=99999999&__gw_ver=1.0&__gw_from=10650013707&__gw_platform=H5";
String params = "{\n" +
" \"districtId\": -1,\n" +
" \"groupChannelCode\": \"RX-OMF\",\n" +
" \"type\": null,\n" +
" \"lat\": -180,\n" +
" \"lon\": -180,\n" +
" \"locatedDistrictId\": 0,\n" +
" \"pagePara\": {\n" +
" \"pageIndex\": 1,\n" +
" \"pageSize\": 10,\n" +
" \"sortType\": 9,\n" +
" \"sortDirection\": 0\n" +
" },\n" +
" \"imageCutType\": 1,\n" +
" \"contentType\": \"json\"\n" +
"}";
注意定义params json串的时候,上面的"head":{'cid': "09031014111431397988"}要去掉,单独申明。
然后:
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),params);
Observable<ResponseBody> observable = RetrofitHelper.getInstance().getServer().getPhoto(TRAVEL_URL,body);
@Headers("cid: 09031014111431397988")
@POST
Observable<ResponseBody> getPhoto(@Url String url, @Body RequestBody info);
这样就可以了。
然后将请求的数据获取,以便设置javabean。
刚开始想将getphoto的返回值设置成Observable<String>,发现根本就得不到数据。
网上查到,需要用Observable<ResponseBody>才行。这样,请求那边的代码就是:
String travel;
public void getTravel() {
Observable<ResponseBody> observable = mModel.getTraver();
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody s) {
/*travel = s.toString();*/
try {
travel = s.string();
Log.v("abbb",travel);//这里得到String
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
mView.getString(travel);//传回view
}
});
}
这里又遇到一个问题,那就是,这个travel的值太长了,无论是在控制台,还是adb logcat ->c:/end.log将log打印出来,
都显示不全,这时候可以选择断点复制log。
具体步骤,debug运行程序,打开as最下面一排下面的Debug窗口,
上面会出现Frames和Variables窗口。在要查看的log.v那一行打上断点,
用手点手机上的app,让程序执行到那一步。可以在Variables窗口看到log,右键复制就可。
参考资料:
Retrofit2-如何在请求时使用动态URL
使用Retrofit通过post提交Json数据
Retrofit进行post提交json数据
Retrofit请求数据返回String
AndroidStudio 打印超长Log显示不全的解决方法
在线JSON字符串转Java实体类(JavaBean、Entity)
网友评论