1.今天在升级基于RxJava2+Retrofit+RxCache的网络请求封装这套框架的过程中遇到一个问题,当我使用Post动态传入url时,服务器一直返回http404 ,我的请求地址末端是这样的:

query?key=7c2d1da3b8634a2b9fe8848c3a9edcba

Retrofit 接口是这样写的

当我发起请求后服务器返回的信息如下:

仔细核对了一下请求地址,发现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类型了。

最新文章

  1. IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)
  2. c++学习--继承与派生
  3. linux 下第一个cordova android app
  4. 【Windows 10 IoT - 2】LED闪烁及动画绘制(树莓派 Pi2)
  5. MFC和GDI+一起使用
  6. 查看Mac电脑的开机记录
  7. java03变量和基本数据类型
  8. php中include文件变量作用域的研究
  9. HTML框架集之Frameset与Iframe简单应用
  10. SpringMVC详解(六)------与json交互
  11. Python3之利用Cookie模拟登录
  12. Java Scanner 类
  13. C# FileSystemWatcher 并发
  14. 关于eclipse配置tomcat时,console打印成功消息,但是不能成功访问页面的问题
  15. python中的异常处理常用方法
  16. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory Type and Attributes
  17. 异构GoldenGate 12c 双向复制配置
  18. 6. python 字符串格式化表达式
  19. 串行通讯协议--起止式异步通讯协议(UART)
  20. 软件测试模型---V模型、W模型、H模型、X模型

热门文章

  1. 生成随机string
  2. JAVA泛型类
  3. XMU 1608 nc与加法进位 【二分】
  4. ORACLE 创建视图索引序列
  5. spring各个jar作用
  6. frameset使用总结
  7. aapt的常用命令
  8. ie7 总结
  9. Ubuntu 12.04下安装配置体验GNOME 3(转载)
  10. jQuery入坑指南