V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abbenyyy
V2EX  ›  Android

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

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

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

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

    接口定义:

        @GET("Expand/WebAPI/Handler.ashx")
        Call<ResponseBody> getSysParaNames(@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
    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   ·   我们的愿景   ·   实用小工具   ·   1113 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:50 · PVG 06:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.