首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Retrofit: response.errorBody不为null,但response.errorBody.string()返回null

Android Retrofit是一个用于处理网络请求的开源库。在使用Retrofit发送网络请求时,有时候会遇到response.errorBody不为null,但response.errorBody.string()返回null的情况。

这种情况通常发生在服务器返回的错误响应中,response.errorBody包含了错误的响应体,但由于某些原因无法通过response.errorBody.string()方法获取到具体的错误信息。

出现这种情况可能有以下几种原因:

  1. 服务器返回的错误响应体不是一个有效的字符串,可能是一个空字符串或者其他非字符串类型。
  2. 服务器返回的错误响应体没有设置正确的Content-Type,导致Retrofit无法正确解析响应体。
  3. 服务器返回的错误响应体被压缩或加密,导致无法通过response.errorBody.string()方法获取到明文的错误信息。

针对这种情况,可以尝试以下解决方法:

  1. 使用response.errorBody().bytes()方法获取错误响应体的字节数组,然后通过字节数组构建一个字符串来获取错误信息。示例代码如下:
代码语言:txt
复制
ResponseBody errorBody = response.errorBody();
if (errorBody != null) {
    byte[] bytes = errorBody.bytes();
    String errorString = new String(bytes);
    // 处理错误信息
}
  1. 检查服务器返回的错误响应体的Content-Type是否正确设置,确保其为"text/plain"或"application/json"等可解析的类型。
  2. 如果服务器返回的错误响应体被压缩或加密,可以尝试使用相应的解压或解密算法对响应体进行处理,然后再获取错误信息。

需要注意的是,以上解决方法仅供参考,具体情况可能因服务器端实现而异。在实际开发中,可以根据具体情况进行调试和处理。

关于Android Retrofit的更多信息和使用方法,可以参考腾讯云的相关产品文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AndroidRetrofit 2.0 的使用一、概述二、原理二、使用

一、概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。...关于REST的介绍可以参考维基百科 retrofit模型如下:(来自如何使用Retrofit写一个Android的REST客户端的小教程) retrofit模型...依赖于okhttp,所以需要集成okhttp API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析 添加权限 由于是网络请求,需要在manifest中添加网络请求的权限 创建实体类 这是使用Gson解析,需要创建一个POJO(Java对象)。...Tips: 当返回结果错误,调用response.errorBody().string();可以得到String类型的请求结果,再次调用response.errorBody().string();得到的结果为

2.2K50
  • Carson带你学Android:网络请求库Retrofit源码分析

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜欢...与其他网络请求开源库对比 除了Retrofit,如今Android中主流的网络请求框架有: Android-Async-Http Volley OkHttp 下面是简单介绍: 一图让你了解全部的网络请求库和他们之间的区别...只打算利用OkHttpCall通过ExecutorCallbackCall切换线程;后来发现使用Rxjava更加方便(不需要Handler来切换线程)。...= 0) { return new Android(); // 此处表示:如果是Android平台,就创建并返回一个Android对象 ->>步骤4 }...支持3个平台:Android平台、Java平台、IOS平台 // 最后返回一个Platform对象(指定了Android平台)给Builder的有参构造方法public Builder(Platform

    1.1K20

    Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一、引入依赖 二、工具类 三、构建网络框架 1. Base 2. 异常处理 3. 拦截器 4....= null && iNetworkRequiredInfo.isDebug()) { //iNetworkRequiredInfo不为空且处于debug状态下则初始化日志拦截器...= null) { //刚才上面定义的Map中键是String,值是Retrofit,当键不为空时,必然有值,有值则直接返回。...(), retrofit); //最后返回即可 return retrofit; } /** * 配置RxJava 完成线程的切换...做上层网络请求接口的封装,同时将需要的数据解析成实体,同时Retrofit还有对RxJava的支持,这样就可以在请求的时候做线程切换,切换到子线程,在数据返回的时候切换到主线程。

    2.4K61

    Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一、引入依赖 二、工具类 三、构建网络框架 1. Base 2. 异常处理 3. 拦截器 4....= null && iNetworkRequiredInfo.isDebug()) { //iNetworkRequiredInfo不为空且处于debug状态下则初始化日志拦截器...= null) { //刚才上面定义的Map中键是String,值是Retrofit,当键不为空时,必然有值,有值则直接返回。...(), retrofit); //最后返回即可 return retrofit; } /** * 配置RxJava 完成线程的切换...做上层网络请求接口的封装,同时将需要的数据解析成实体,同时Retrofit还有对RxJava的支持,这样就可以在请求的时候做线程切换,切换到子线程,在数据返回的时候切换到主线程。

    2.3K61

    Retrofit源码之请求对象的转换笔记

    之前在Retrofit源码初探一文中我们提出了三个问题: 什么时候开始将注解中参数拼装成http请求的信息的? 如何产生发起http请求对象的? 如何将对象转换成我们在接口中指定的返回值的?...= null) { return adapter; } } //省略一些不重要代码 } 这里主要就是遍历Retrofit的所有CallAdapter,然后找到能够处理该返回类型以及方法注解的那个直接返回...对于默认返回类型的处理CallAdapter,其实是在Retrofit生成时默认加上的: public Retrofit build() { //省略部分代码 Executor callbackExecutor...,我们先看下它是怎么回事: @Nullable Executor defaultCallbackExecutor() { return null; } 咦,为什么是返回null的?...总结 上面源码分析了很多,有点杂乱,这里我们统一总结下OkHttpCall到接口定义的返回类型(这里以Call<ResponseBody 为例,)的转换过程: 通过platform(在Android平台上是它的子类

    43630

    【建议收藏】Android实现Rxjava2+Retrofit完美封装

    去年的时候学习了Rxjava和Retrofit的基本用法,一直没有在实际项目中运用。今年开做新项目,果断在新项目中引入了RxJava和Retrofit。...} } RetrofitUtils用来构建Retrofit.Builder,并对OkHttp做以下几个方面的配置: 设置日志拦截器,拦截服务器返回的json数据。...其中code为服务器返回的错误码。我们会事先和服务器约定成功时的code值,比如200表示请求成功。通常在请求服务器数据过程中免不了会出现各种错误。例如用户登录时密码错误、请求参数错误的情况。...此时服务器会根据错误情况返回对应的错误码。一般来说,我们只关心成功时即code为200时的content数据。而对于code不为200时我们只需要给出对应的Toast提示即可。...*/ abstract public void onSuccess(T response); /** * 服务器返回数据,响应码不为200 *

    1.9K50

    Android网络访问库 - Retrofit学习(1)基础

    Retrofit是什么 Retrofit是一个类型安全的HTTP客户端,支持Android和Java.它是Square公司开源的项目,当前版本2.0。...同步和异步,和终止 Retrofit 1.x 时,在服务接口的声明中,同步方法需要一个返回值,异步方式需要一个 Callback 的泛型参数作为最后一个参数。...2.x不再以参数和返回值的方式区分异步同步的请求。 “调用”的区别 Retrofit 1.9 时 同步是直接调用。 而异步需要传入回调的实现。在实现里处理成功和失败的方法。...response.code(); // handle request errors yourself ResponseBody errorBody = response.errorBody...你可以使用 Observable 作为接口声明的返回值。 第二个依赖是 AndroidSchedulers 类所需要的,它提供了 在Android主线程的调度方式。

    1K00

    Retrofit是如何创建的?为什么要用动态代理

    Retrofit的出现让Android的网络请求变得异常简单,同时可以很好的配合后台的REST接口。非常值得我们去探究一下它的原理。...在Retrofit中,内置了两种平台,一种是Android,一种是Java8。不同的平台,处理的方式不同。...平台里是返回了MainThreadExecutor,里面提供了一个handler,并且这个handler是传入的主线程的Looper,也就是说在execute方法里面,handler.post实际上是在主线程...method, @Nullable Object[] args) throws Throwable { // 方法定义所在的类,这里我们是定义在接口里面,返回...总结 Retrofit在创建的过程中,有这么一些东西需要我们注意 platform 这个是Retrofit支持的平台,里面有Android和Java8,这里自然是Android callFactory

    2.3K00

    Kotlin开发的一些实用小技巧总结

    例如: val gankApi: GankApi by lazy { val retrofit: Retrofit = Retrofit.Builder() .baseUrl(API_URL)...= supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as FeedFragment 实际上这样只能导致崩溃。...当调用『as』时,它将进行对象转换,如果转换的对象为『null』时,则会报错。正确的使用方式应该是用『as?』: var feedFragment: FeedFragment?...replace(R.id.root_fragment, feedFragment, TAG_FEED_FRAGMENT) .commit() } 13. let 操作符 『let』操作符:如果对象的值不为空...apply 可以避免创建 builder 的方式来使用,因为对象调用的函数可以根据自己的需要来初始化自己,然后 apply 函数会返回它同一个对象: user = User().apply { firstName

    1.1K10

    「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Android 的设计的 REST 客户机。...是结合 OkHttp 做网络请求用的,所以悉心提醒记得开下网络权限: 全面进击...细心观察发现,第一步 Retrofit 的实例化过程,只要服务器不换代码几乎是不变的,所以我们完全可以将它封装 而且大家有没有发现,如果单单使用 OkHttp 我们的返回值是一个 Response...的使用都已近有了一定的了解, Retrofit 的好处并不只是这些,还有很多跟深入的只是需要了解,本文限于篇幅,无法向大家一一介绍 对于我前面的 FIWKeepApp 这个仓库,我将一步步转换到...Retrofit + OkHttp 的形式下,欢迎大家关注我的 这个仓库,进行学习,也欢迎各位老铁给个 star 后面我还会对 Android 的各种知识点、Framework 层源码,三方库等进行解析

    1.2K30
    领券