请教下 retrofit2 配合 RXJava 如何提取返回的字符串?谢谢! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abbenyyy
V2EX    Android

请教下 retrofit2 配合 RXJava 如何提取返回的字符串?谢谢!

  •  
  •   abbenyyy 2017-02-14 10:46:24 +08:00 16746 次点击
    这是一个创建于 3191 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为公司的后端弄得接口返回不是正确格式的 JSON 数据,所以要自己提取返回的字符串再处理。

    单纯用 retrofit2 提取返回的字符串我知道,如下:

    接口定义:

     @GET("Expand/WebAPI/Handler.ashx") Call<ResponseBody> gtSysParaNames(@Query("action") String action , @Query("SysParaNames") String sysParaNames ); 

    然后使用的时候利用 ResponseBody.body().string 就可以获得服务器返回的字符串。

    但最近在研究 retrofit2 配合 RXJava 使用,搜索了一下,自己也试了一下,发觉无法提取服务器返回的字符串,所以请教一下大家,怎么做可以 retrofit2 配合 RXJava 提取服务器返回的字符串然后再自行处理,谢谢。

    13 条回复    2017-02-15 09:06:11 +08:00
    ilumer
        1
    ilumer  
       2017-02-14 10:58:12 +08:00 via Android
    retrofit adapter 里有个 results 泛型类,这个类里面有 response
    loshine1992
        2
    loshine1992  
       2017-02-14 11:00:27 +08:00
    自己实现一个 adapter
    rockyou12
        3
    rockyou12  
       2017-02-14 11:12:30 +08:00
    简单点写个 Observable<String> getSomething(),然后写个工具类,加个带泛型的方法 map 转成需要的对象

    public static <T> Observable<T> map(Observable<String> o, final Class<T> clazz){
    return o.map(s-> gson.fromJson(s,clazz));
    }

    要是能力强可以考虑自己写个 retrofit 的 adapter
    brucezz
        4
    brucezz  
       2017-02-14 11:17:32 +08:00
    可以自定义 convertor ,在其中做字符串的处理,解析成正常的 model ,返回给上层使用。
    Grubber
        5
    Grubber  
       2017-02-14 11:18:22 +08:00
    ScalarsConverterFactory
    basefas
        6
    basefas  
       2017-02-14 11:20:57 +08:00   1
    这种情况不是应该去怼后端么
    xingda920813
        7
    a href="/member/xingda920813" class="dark">xingda920813  
       2017-02-14 11:31:03 +08:00
    怼后端 +1, 公司的后端弄得接口返回不是正确格式的 JSON 数据, 这也能忍? 看到接口是 ashx, 说明后端是 .NET, 你懂的. 结合楼主之前发的帖子, 趁年终奖拿了赶快去更好的地方吧.
    xingda920813
        8
    xingda920813  
       2017-02-14 11:36:23 +08:00
    楼上技术方面解答的都很好, 尤其是 #3, map 操作符变换 Observable, 但 JSON 不合法明显是服务端的错误.
    nashxk
        9
    nashxk  
       2017-02-14 11:40:22 +08:00
    自己封装一个 Interceptor ;如果用 Gson 的话,记得“ new GsonBuilder().setLenient().create()”。。这个后端不返回标准的 JSON ,真应该去怼后端了。。。
    3pmtea
        10
    3pmtea  
       2017-02-14 12:00:49 +08:00
    用 converter+1 ,如果打算自己写 converter 的话,@Override 的 responseBodyConverter 方法里直接 return ResponseBody::string 就行了
    3pmtea
        11
    3pmtea  
       2017-02-14 12:06:09 +08:00
    lijy91
        12
    lijy91  
       2017-02-14 12:57:44 +08:00
    建议还是和后端沟通,返回规范化的数据。
    jinhan13789991
        13
    jinhan13789991  
       2017-02-15 09:06:11 +08:00 via Android
    http://www.jianshu.com/p/2263242fa02d
    我之前的公司后台返回的数据格式有六七种之多,看了这个博客后,我自己模仿写了一个。完美屏蔽底层。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     925 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 21:23 PVG 05:23 LAX 13:23 JFK 16:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86