美文网首页
retrofit post请求

retrofit post请求

作者: jiluyixia | 来源:发表于2019-11-01 15:25 被阅读0次

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)

相关文章

网友评论

      本文标题:retrofit post请求

      本文链接:https://www.haomeiwen.com/subject/cfofbctx.html