1.今天在升級基于RxJava2+Retrofit+RxCache的網絡請求封裝這套框架的過程中遇到一個問題,當我使用Post動態傳入url時,服務器一直返回http404 ,我的請求地址末端是這樣的:
query?key=7c2d1da3b8634a2b9fe8848c3a9edcba
Retrofit 接口是這樣寫的
@POST("{url}")
Observable<ApiResponse<TestBean>> basePost( @Path("url") String url, @QueryMap Map<String, String> maps);
當我發起請求后服務器返回的信息如下:
仔細核對了一下請求地址,發現retrofit 居然把url中的"?"轉義成了"%3F",最終導致url錯誤,reason中提示了接口地址不存在,不知道為什么會出現這樣的問題。
后來的解決辦法是修改了一下請求接口,改成了如下的形式:
@POST
Observable<ApiResponse<TestBean>> basePost(@Url String url, @QueryMap Map<String, String> maps);
再次請求居然成功了。
現在還不清楚這兩種方式到底有什么不同。
2.當使用Gson解析json數據時,如果你的結果類型是一個泛型比如T,此時這個T如果又被其他類包裹那么我們通常的寫法是這樣
public static <T> ApiResponse<T> fromJson(String json)
{
return new Gson().fromJson(json, new TypeToken<ApiResponse<T>>() {}.getType());
}
這樣的寫法最終是無法獲取到結果的,你會得到以下錯誤
Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.hengda.platform.easyhttp.example.TestBean
這是因為Gson 中的TypeToken 的實現邏輯是,根據TypeToken 的派生類.使用getGenericSuperclass 獲取泛型信息的. 而我們這邊的泛型并沒有辦法被正確的傳遞.,既然沒有正確傳遞,那么只要給它傳遞正確的類型即可。修改fromJson方法如下
public static <T> ApiResponse<T> fromJson(String json,Class<T> cla) {
Type type= $Gson$Types.newParameterizedTypeWithOwner(null, ApiResponse.class, cla);
return new Gson().fromJson(json, type);
}
這樣就能正確返回我們需要的T類型了。