okhttp踩坑
ResponseBody.string()
平常我们用的客户端http调用工具一般是RestTemplate,HttpClient,okhttp,以前使用过前两者,没咋接触过okhttp,我看公司项目中使用okhttp比较多,于是我这次也用了一下okhttp,果不其然,还是自己踩了一个坑:
下面是一个okhttp请求的代码块:
...
okhttp3.Request okHttpRequest = new okhttp3.Request.Builder()
.url(saveUrl)
.post(requestBody)
.build();
Call call = okHttpClient.newCall(okHttpRequest);
try {
okhttp3.Response response = call.execute();
if (Objects.nonNull(response)) {
ResponseBody responseBody = response.body();
if (Objects.nonNull(responseBody)) {
log.info("responseBody:{}", responseBody.string());
String responseBodyString = responseBody.string();
Response resultTmp = JSON.parseObject(responseBodyString, Response.class);
if (resultTmp.getCode() == ResponseCodeEnum.COMPANY_NOT_EXSIT.getCode()) {
throw new GlobalException(ResponseCodeEnum.COMPANY_NOT_EXSIT);
}
}
} else {
log.info("erp-service saveQuesFeedback-请求没有返回数据");
}
} catch (IOException e) {
log.error("erp-service-forward saveQuesFeedback-Exception", e);
throw new GlobalException(ResponseCodeEnum.FAIL);
}
...
一般在请求http的时候,习惯先打印返回的数据,然后再取值。在调试的时候,每次请求都是返回的成功结果,但是走到后边的code判断逻辑就开始报异常,responseBody:{}都是打印的正常结果,那问题在哪呢,刚开始调试粒度太宽,后边一行一行的来进行调试,发现走到第13行,取到结果是空的,说明responseBody.string()没有获取到,但是日志里面明明打印的有,结果查看了一下源代码:
public abstract class ResponseBody implements Closeable {
@Nullable
private Reader reader;
public ResponseBody() {
}
public final String string() throws IOException {
BufferedSource source = this.source();
Throwable var2 = null;
String var4;
try {
Charset charset = Util.bomAwareCharset(source, this.charset());
var4 = source.readString(charset);
} catch (Throwable var8) {
var2 = var8;
throw var8;
} finally {
if (source != null) {
$closeResource(var2, source);
}
}
return var4;
}
}
ResponseBody实现了Closeable,然后获取body的内容,finally中closeResource,原来在获取string后会关闭数据流,
所以在第二次就获取不到数据了。
所以在使用response.string()的时候要先取出返回的数据,然后再打印结果:
// 此处responseBody.string 只能获取一次就会关闭,所以要先赋值
String responseBodyString = responseBody.string();
log.info("responseBody:{}", responseBodyString);
okhttp踩坑的更多相关文章
- OkHttp踩坑记:为何 response.body().string() 只能调用一次?
想必大家都用过或接触过 OkHttp,我最近在使用 Okhttp 时,就踩到一个坑,在这儿分享出来,以后大家遇到类似问题时就可以绕过去. 只是解决问题是不够的,本文将 侧重从源码角度分析下问题的根本, ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
- router路由去掉#!的踩坑记
项目中在研究去掉router#!的过程中的踩坑过程.
- vue+ vue-router + webpack 踩坑之旅
说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案 老司机可以忽略下面的内容了 1)起因 考虑到数据分离的问题 因为server是express搭的 自然少 ...
- 记jQuery.fn.show的一次踩坑和问题排查
最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...
随机推荐
- 手摸手带你用Hexo撸博客(一)
原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...
- JDK下载地址 Oracle JDK下载 地址 (已解决)
现在JDK开始收费了 Oracle官方对JDK的管理也变得严格了,现在想要在官网下载jdk需要先注册Oracle账号,这倒是小事但是网页反应慢注册填写内容复杂导致很多人不想注册. 不过有的人提供了公开 ...
- Class的一些使用技巧?
1.forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象.例如 Object obj = Class.forName(s).newInstance(); 2.虚拟机 ...
- hashmap简单实现
p.p1 { margin: 0; font: 11px Monaco } p.p2 { margin: 0; font: 11px Monaco; min-height: 15px } p.p3 { ...
- 回顾maven项目的spring boot相关知识点
2021新年快乐! 在参加完研究生考试后,感觉像是放下了一个大负担,但并不能就此以为什么都结束了.反而,当我今天去看了一下之前老师带领我们班级做的一个maven项目,感觉像是第一次看到这个,十分陌生. ...
- kafka的概念
1.生产者: 生产者发送消息到broker,有三种确认方式(request.required.acks)acks = 0: producer不会等待broker(leader)发送ack .因为发送消 ...
- 最开始的总结——JAVA
<最开始的总结> 回答自己几个问题:为什么去学它?学它有什么用?怎样去学它?自己目前目标是什么?估计自己会花多长时间去学习这些? 一.为什么学习Java,它有什么用? 答:我看中的是Jav ...
- Windows搭建SkyWalking8.3环境进行JAVA应用性能监控及入门示例(使用Mysql持久化)
下载SkyWalking 一.下载地址(点击) 选择tar 解压后进入config文件夹先配置一下Mysql数据源,打开application.yml文件 默认selector是h2我们改成mysql ...
- MySql创建存储过程,并使用事件定时调用
一.使用命令行创建存储过程的步骤 :参数详情参考 https://www.mysqlzh.com/ 1.模板 delimiter $$ # 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ' ...
- nodejs事件和事件循环详解
目录 简介 nodejs中的事件循环 phase详解 timers pending callbacks idle, prepare poll轮询 check close callbacks setTi ...