Retrofit2 反序列化响应主体,即使响应不是 200

2023-12-31

我希望能够反序列化对同一 Java 对象的网络响应,即使响应不成功。目前,当我收到像 403 这样的错误响应时,响应正文为空,我希望使用 response.errorBody() 方法来读取已发回的任何内容,这是可以的。但是我想避免在改造回调中包含大量代码只是为了反序列化 errorBody。相反,我想要一个拦截器,将 errorBody 的内容设置到 body 中。

原因是我有一个响应对象,其中包含错误和非错误响应的字段,并且根据响应的状态,某些字段预计保留为空,例如

错误响应 JSON

{
"locked":true,
"remaining_attempts": 2
}

成功响应 JSON

{
"name":"kev"
"token":"abcdefghijklmnopq"
}

我创建了一个 Java 对象来捕获这两种情况:

class LoginResponse{
    @Expose
    private String name;
    @Expose
    private String token;
    @Expose
    private Boolean locked;
    @Expose
    private Integer remaining_attempts;
}

有没有办法在拦截器中做到这一点?


Retrofit 通过将序列化部分委托给转换器来完成序列化部分,您可以使用以下命令将特定的序列化部分添加到构建器builder.addConverterFactory(GsonConverterFactory.create())并且已经有很多书面的Retrofit Converters,你可以找到其中的大部分here https://github.com/square/retrofit/tree/master/retrofit-converters.

因此,如果您想控制反序列化的过程,您可以编写自定义转换器,如下所示

public class UnwrapConverterFactory extends Converter.Factory {

    private GsonConverterFactory factory;

    public UnwrapConverterFactory(GsonConverterFactory factory) {
        this.factory = factory;
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(final Type type,
            Annotation[] annotations, Retrofit retrofit) {
        // e.g. WrappedResponse<Person>
        Type wrappedType = new ParameterizedType() {
            @Override
            public Type[] getActualTypeArguments() {
                // -> WrappedResponse<type>
                return new Type[] {type};
            }

            @Override
            public Type getOwnerType() {
                return null;
            }

            @Override
            public Type getRawType() {
                return WrappedResponse.class;
            }
        };
        Converter<ResponseBody, ?> gsonConverter = factory
                .responseBodyConverter(wrappedType, annotations, retrofit);
        return new WrappedResponseBodyConverter(gsonConverter);
    }
}

然后你用addConverterFactory()再次向 Retrofit 介绍新转换器。 我应该提到的是,您可以在 Retrofit 中使用多个转换器,这非常棒,它只需按顺序检查转换器,直到找到合适的转换器即可使用。

资源:编写自定义 Retrofit 转换器 http://blog.davidmedenjak.com/android/2016/07/12/retrofit-converter-unwrapping.html, 使用多个转换器 https://futurestud.io/tutorials/retrofit-2-introduction-to-multiple-converters#2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit2 反序列化响应主体,即使响应不是 200 的相关文章

  • 房间数据库更改未触发观察者

    当房间数据库更改时 我试图更新 RecyclerView 但是 当数据库发生更改时 不会调用 MainActivity 中定义的观察者的 onChanged 方法 如果我让 DAO 返回 LiveData 而不是 List 并在 ViewM
  • 如何使用 gradle 从 3 个子模块构建 1 个 jar

    I have 安卓工作室3 gradle 4 1 梯度工具3 classpath com android tools build gradle 3 0 1 当我有一个模块并使用 gradle 工具 2 时 我使用了 task makeJar
  • 如何在应用程序关闭时在 Android 通知中显示操作按钮?

    我有一个安卓应用程序 对于通知 我们必须显示一些操作按钮 当应用程序打开时 我们可以自由地构建通知并显示操作按钮 但是当应用程序关闭时 通知会在 Android 的通知托盘中收到 应用程序开发人员无法控制构建用户界面和操作按钮 我们现在如何
  • 在 Android 上使用 AT 命令与调制解调器对话

    我试图与三星 Galaxy s2 plus 和华为 p1 xl u9200 调制解调器发送 AT 命令 但无法得到任何结果 我使用 adb shell 发送命令并使用 logcat 查看日志 在三星 当我执行 cat 时 proc tty
  • Android:初始化本机 AudioRecord 对象时 AudioRecord 错误代码 -20

    Android 我想从麦克风读取缓冲区 以便我可以对其执行处理 以下是我的代码 int sampleRateInHz 8000 44100 22050 and 11025 int channelConfig AudioFormat CHAN
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 为什么反射会减慢Android手机的速度

    我多次读到反射会降低手机性能 这有多真实 例如 在我的例子中 我从 Web 服务获取一些参数 这些参数与我在 Android 应用程序中的类的参数同名 所以我只是使用java字段和反射设置这些参数的值 它似乎并没有降低性能 有人可以向我解释
  • 覆盖 Android 中的电源按钮

    我正在开发一个应用程序 其中我需要在按下电源按钮时执行一个操作 但不幸的是我无法处理按下电源按钮时的操作 我尝试使用 onKeyDown 和dispatchKeyEvent 方法 但似乎没有任何效果 任何人都可以建议我解决这个问题的任何其他
  • Android 全屏对话框确认和拒绝操作

    材料设计中的全屏对话框应该在操作栏 工具栏上有确认和拒绝操作 我的问题是 我该怎么做 显示对话框 getFragmentManager beginTransaction add R id container new MyDialogFrag
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 需要 Android webview window.open() 和 window.close() 的信息

    我正在开发一个安卓应用程序 这是我网站的 WebView 该网站包含一个弹出按钮 单击该按钮后 将打开一个新窗口并显示内容 该链接可以来自外部站点 然而 当我实现此操作时 新选项卡正在打开 之后它会弹出以打开浏览器 尽管在 Web 视图中打
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • 如何将样式应用于我拥有的所有 TextView? [复制]

    这个问题在这里已经有答案了 可能的重复 设计所有 TextView 或自定义视图 的样式 而不向每个 TextView 添加样式属性 https stackoverflow com questions 6801890 styling all
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • 如何更改操作栏背景和文本颜色

    我正在使用本教程中的导航抽屉 http www androidhive info 2013 11 android sliding menu using navigation drawer http www androidhive info
  • Android MulticastSocket.joinGroup 不会触发发送 IGMP 消息

    Code MulticastSocket s new MulticastSocket InetAddress addr InetAddress getByName 230 230 230 1 s joinGroup addr 在 Ubunt
  • Android GetPTLAFormat 上的 Phonegap 错误

    我们正在开发一个使用 jQuery 移动和电话间隙的应用程序 一切似乎都工作正常 但是当在连接的 Android 手机上运行应用程序时 我们在 Eclipse logcat 中看到大量类似这样的错误 0 GetPTLAFormat inva

随机推荐

  • 如何将 Jquery 变量值发送或分配给 php 变量? [复制]

    这个问题在这里已经有答案了 我想在用户单击它时将 img src 获取到 php 变量 因此当用户单击该图像时我使用 jquery 函数来获取 img src 下面的 jquery 用于获取 img src img click functi
  • Apache CGI 重定向到绝对 URI 不起作用

    我在 Windows 上以控制台模式运行 Apache 2 2 13 我制作了一个处理请求的可执行文件 在某些情况下 当它检测到指向目录但没有尾部斜杠的 URL 时 它会尝试重定向到附加了缺少的斜杠的同一 URL 退出代码设置为 301 奇
  • Python:查找列表中最长/最短的单词并在函数中调用它们

    我有一个单词列表 单词 阿尔法 欧米伽 上 下 上 下 紫色 红色 蓝色 绿色 我有两个函数应该找到此列表中最短和最长的单词 def bigWords list args largestWord largestLen 0 for word
  • htaccess 规则在本地主机上不起作用

    抱歉我改变了之前的问题 我在 localhost 上遇到 htaccess 重写规则问题 我在 http localhost testing htaccess 中有 htaccess 文件 我想更改如下所示的网址 http localhos
  • PHP 和 MySQL 计算动态页面浏览量的最佳方法

    计算动态页面 如下面的 url 示例 的页面浏览量的最佳方法是什么 我正在使用 PHP 和 MySQL 简短的解释会有所帮助 谢谢 http www example com posts post php id 3 http www exam
  • 使用 Dajaxice 获取 AJAX 调用的对象值

    我有一个Song模型与一个votes属性 我有一个Vote as Favourite每个按钮下方显示Song目的 我希望当用户点击Vote as Favourite按钮votes与此相关的属性Song对象应该增加 1 并且所有Vote as
  • 当模型中的列表更改时,ViewModel 中的 ObservableCollection 不会更新

    假设我有一个模型类Data我想创造DataViewModel and DataView为了它 数据类如下所示 public class Data public Data RandomData new List
  • 集合属性应该是只读的 - 漏洞?

    在遵守代码分析错误的过程中 我正在更改我的属性以拥有私有设置器 然后我开始尝试去理解why多一点 MS 表示 根据一些研究this http msdn microsoft com en us library ms182327 aspx 可写
  • 为什么在对话流中创建的丰富消息不会出现在 Slack 上测试的机器人中?

    我为默认欢迎意图创建了两个答案 一个是默认的 另一个是显示在 Slack 中的文本响应 另一个使用 Slack 作为我的机器人的通道 单击 添加响应 开始使用 Dialogflows UI 为 Slack 创建响应 第二个如下 blocks
  • 如何使用持久堆图像在 Isabelle/jEdit 中更快地加载理论?

    假设我有一个目录isabelle afp存储了很多理论的地方 该目录是一个库 我不打算更改其中的文件 我想加快 Isabelle jEdit 的启动时间 默认情况下 所有理论isabelle afp我当前的理论取决于重新处理 我怎样才能跳过
  • 强制 Windows 视频驱动程序重新加载。有可能吗?

    某些驱动程序在启动时加载时使用注册表中写入的参数来配置自身 我可以修改这些值然后重新启动 但我想知道是否可以强制重新加载驱动程序 使更改在不重新启动的情况下生效 具体来说 我正在谈论视频驱动程序 nvidia 我在某处读到 通过 pINvo
  • 设置字节编译目标文件函数

    我想使用相对路径设置 emacs lisp 字节编译的目标目录 例如 foo 我发现我应该使用byte compile dest file function 但不知道如何设置 我该如何设置呢 要设置byte compile dest fun
  • 如何使用十六进制表示法为 char* 赋值?

    我通常按 以下方式使用指针 char ptr malloc sizeof char 100 memset ptr 0 100 strncpy ptr cat 100 1 但这次我不想使用 cat 而是使用十六进制的 ASCII 等效值 猫
  • NLog v2 可以与 Common.Logging 一起使用吗

    我今天尝试将它们一起使用 但发现版本不匹配 因为它正在寻找 NLog v1 Common Logging 支持 NLog v2 吗 如果没有 有人知道是否可以安全地使用程序集版本重定向吗 您可以简单地在 app config 或 web c
  • 如何在 ES6 中创建主导入文件?

    我正在寻找使用创建一个主导入文件ES6句法 我有一个组件目录index js file 我想export如果有意义的话 进口 本质上 我想将各个组件文件导入然后导出到索引文件中 以便我可以解构我的imports来自任何其他文件 如下所示 i
  • jQuery 颜色 **样本** 选择器

    有没有人编写了一个 jQuery 查询颜色选择器 可以让您从预定的颜色列表中选择颜色 类似于电子商务网站上的产品颜色选择器 我所做的大部分搜索都揭示了许多通用目的 即在 RGB 光谱中选择任何颜色 但很少有用于选择特定颜色的选项 我制造了一
  • 调整 HTML5 画布大小以适合窗口

    如何自动缩放 HTML5
  • Firebase云功能自定义域[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 firebase 的新 HTTPS 云功能连接到自定义域 因此 例如 example com 将转到 us central1 MY
  • Tomcat 8 无法加载网站

    我是 java servlet 编程的新手 正在学习这一点 我的 debian 计算机上安装的 tomcat 最初可以显示默认的示例网页 但是将 var lib tomcat8 webapps ROOT 中的加载文件替换为示例页面后 网站无
  • Retrofit2 反序列化响应主体,即使响应不是 200

    我希望能够反序列化对同一 Java 对象的网络响应 即使响应不成功 目前 当我收到像 403 这样的错误响应时 响应正文为空 我希望使用 response errorBody 方法来读取已发回的任何内容 这是可以的 但是我想避免在改造回调中