为什么 HTTP Code 204 会导致 Retrofit 出现 NullPointerException?

每日一问-Android-20181031为什么 HTTP Code 204 会导致 Retrofit 出现 NullPointerException?答:

今天在做网络接口的时候, 一个返回结果应该是 的接口出现了异常:

根据错误信息, 进入代码可得:

此处代码, 说明服务器返回的成功,已经进入 onNext 回调了, 但是其 value 是 null, 我们在往上看调用信息, 在实际的 方法中将 Response 进行传递.

这里的 Response 是 retrofit 内置的 Resonse 不是 Okhttp 里面的 Response, 部分代码如下:

这个 Response 怎么来的呢?看 方法这个代码块:

是 Okhttp 的 Call 的执行结果, 这里的实现类是:

Call 执行以后对结果进行解析处理:

重点来了:在这个解析的代码中, 如果服务器返回的 HTTP Code 是 204 或者 205, 那么其 body 会置为 null, 所以会出现 NullPointException

那么, HTTP Code 204 是什么意思呢? 这里引用 Mozilla 的说明:

HTTP协议中 204 No Content 成功状态响应码表示目前请求成功,但客户端不需要更新其现有页面。204 响应默认是可以被缓存的。在响应中需要包含头信息 ETag。

其实就是, 请求服务器成功了, 但是没有数据返回给你.

实际的网络请求是什么样呢(接口已做马赛克处理)?

从日志上上看,服务器确实返回了 204, 那么我们怎么处理这个异常呢?

从实际的现象来看, 这个异常只是打印了异常信息, 而不会引发程序的崩溃. 个人认为可以这样处理:

不做任何处理

将此 204 使用 Observable 的 map 转换分发到 onException 分支

如果服务器返回的数据格式类似下面这样:

那就在 结果返回时添加 Function 转换, 返回一个data 为 null 的 JavaBean.

操作过程:

1.将 rest service 的接口返回值改为:

2.创建新的 Function类:

调用处在处理数据的时候要做判 null 处理.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181031G20NXL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券