使用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)