使用Retrofit接收的数据一直是Json,这次遇到了一个返回数据不是Json的,Gson解析当场报错:com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 17 path $.forumbits[0]
@GET("login/base/getCode")
Observable<Object> getVerificationCode(@Query("state") String state);
我就相当郁闷,我都用Object接收数据了,还有问题?
于是我就打开Postman看一下这个接口到底返回的是什么,Postman给我的返回结果直接是一张图片;大吃一惊!这不符合逻辑呀还能返回一张图片,研究一下发现其实返回的是个bytes数组,Postman直接转成图片了;于是我找到了后台开发人员:
我:这个接口有问题呀,怎么直接返回一张图片;
后台:嗯,这个接口就是这样的;
我:能不能改一下,返回一个图片的Url;
后台:这是老接口,改不了;
结束!!!
1、在网上扒拉一圈这个错误,有人说“BaseUrl结尾必须是/”,这玩意回答的牛头不对马嘴;有人说把接收类型改为JsonObject,必须是com.google.gson包下面的,不能是JSONObject;
这个可以试一下:
@GET("login/base/getCode")
Observable<JsonObject> getVerificationCode(@Query("state") String state);
结果还是报错;
2、于是我就不用Retrofit了,直接上Okhttp访问网络,哎你别说,这个还可行;当场就把bytes数组取出来了;可是感觉太好,其它地方用的都是Retrofit,又研究一番发现Okhttp接收的参数是:Response格式,想着用Response接收一下,发现了这个:
@GET("login/base/getCode")
Observable<ResponseBody> getVerificationCode(@Query("state") String state);
完美!!!
ResponseBody可以直接接收返回数据,然后ResponseBody.bytes()就可以取出bytes数组,ResponseBody.string()可以直接取出String;
好了,就这样把:使用ResponseBody接收Retrofit返回非Json的数据;接收(string、bytes)