美文网首页
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