因为公司的后端弄得接口返回不是正确格式的 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 提取服务器返回的字符串然后再自行处理,谢谢。
1
ilumer 2017-02-14 10:58:12 +08:00 via Android
retrofit adapter 里有个 results 泛型类,这个类里面有 response
|
2
loshine1992 2017-02-14 11:00:27 +08:00
自己实现一个 adapter
|
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 |
4
brucezz 2017-02-14 11:17:32 +08:00
可以自定义 convertor ,在其中做字符串的处理,解析成正常的 model ,返回给上层使用。
|
5
Grubber 2017-02-14 11:18:22 +08:00
ScalarsConverterFactory
|
6
basefas 2017-02-14 11:20:57 +08:00 1
这种情况不是应该去怼后端么
|
7
xingda920813 2017-02-14 11:31:03 +08:00
怼后端 +1, 公司的后端弄得接口返回不是正确格式的 JSON 数据, 这也能忍? 看到接口是 ashx, 说明后端是 .NET, 你懂的. 结合楼主之前发的帖子, 趁年终奖拿了赶快去更好的地方吧.
|
8
xingda920813 2017-02-14 11:36:23 +08:00
楼上技术方面解答的都很好, 尤其是 #3, map 操作符变换 Observable, 但 JSON 不合法明显是服务端的错误.
|
9
nashxk 2017-02-14 11:40:22 +08:00
自己封装一个 Interceptor ;如果用 Gson 的话,记得“ new GsonBuilder().setLenient().create()”。。这个后端不返回标准的 JSON ,真应该去怼后端了。。。
|
10
3pmtea 2017-02-14 12:00:49 +08:00
用 converter+1 ,如果打算自己写 converter 的话,@Override 的 responseBodyConverter 方法里直接 return ResponseBody::string 就行了
|
11
3pmtea 2017-02-14 12:06:09 +08:00
|
12
lijy91 2017-02-14 12:57:44 +08:00
建议还是和后端沟通,返回规范化的数据。
|
13
jinhan13789991 2017-02-15 09:06:11 +08:00 via Android
http://www.jianshu.com/p/2263242fa02d
我之前的公司后台返回的数据格式有六七种之多,看了这个博客后,我自己模仿写了一个。完美屏蔽底层。 |