美文网首页Net@IT·互联网程序员
Retrofit2.0动态url遇到的坑

Retrofit2.0动态url遇到的坑

作者: Knight_Davion | 来源:发表于2017-05-11 14:53 被阅读2895次

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类型了。

相关文章

  • Retrofit2.0动态url遇到的坑

    1.今天在升级基于RxJava2+Retrofit+RxCache的网络请求封装这套框架的过程中遇到一个问题,当我...

  • retrofit2.0 post动态url

    就这个动态url的问题试了无数遍 百度并没有一个文章给出明确的解决方法 总结: post需求 http://api...

  • Retrofit2.0 缓存遇到的坑

    Retrofit初始化 做的缓存拦截器... 下载PDF文件,需实时请求网络最新数据,但每次下载过后删除本地文件后...

  • url转码遇到的坑

    一、问题背景 相信很多ios开发者在项目中都需要用到uiwebview,那就离不开url了,一般符合网络标准的...

  • URL编码遇到的坑

    问题描述: 之前对接别人的接口一直好好的,突然有一天出问题了。昨天更新了代码,更新了http的get请求方法,问题...

  • URL 转码遇到的坑

    1. 背景 做图片中心时, 需要根据图片URL去下载图片, 发现部分URL浏览器里面能访问,但是代码无法下载 原...

  • 深入理解Flask路由 (3) - 动态 url 及转换器

    本篇讲解动态 url 和转换器的用法及原理。 动态 url 实现原理 动态 url 由 werkzeug 通过转换...

  • (技术)Android修改桌面图标

    先说说遇到的坑 多入口配置 显示多个启动入口 通过代码动态更换应用图标 动态更换应用图标填坑指南 所有的想法都要落...

  • Retrofit2.0用@Path和@Query遇到的坑

    前言 最近在忙工作和毕业设计,本来没有写简书的习惯,但考虑到解决完问题如果没有趁热及时记录下来,下一次可能会重蹈覆...

  • 动态添加SwitchCompat遇到的坑

    项目中遇到需要向layout中动态添加SwitchCompat等一些View,结果添加后报了这个NPE 查了很久,...

网友评论

  • 程序员飞飞:兄die,给你一个赞!
  • 一瞬间的浮华:很赞,本来看动态url的,结果看到gson解析带泛型的类,这问题前连天刚遇到,没解决,真是太感谢了
  • dasan沈扬:Url 一半是动态的,比如签名的schema和 host是动态的,path是固定,怎么处理?
    陆灬羽:https://www.jianshu.com/p/2919bdb8d09a 大神文章,你可以参考下

本文标题:Retrofit2.0动态url遇到的坑

本文链接:https://www.haomeiwen.com/subject/evpotxtx.html