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,刚好踩坑了,特意记录一下. 本文内容如 ...
随机推荐
- Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...
- 九、kafka伪分布式和集群搭建
伪分布式: 1.先将zk启动,如果是在伪分布式下,kafka已经集成了zk nohup /kafka_2.11-0.10.0.1/bin/zookeeper-server-start.sh /kafk ...
- Let’s Encrypt 通配符证书,泛域名证书申请配置
首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/. 参考链接:https://github.com/N ...
- Itranswarp 搭建个人 Wiki
www.swack.cn - 原文链接:Itranswarp 搭建个人 Wiki 从零开始 搭建个人Wiki站点 Itranswarp.js 是一款基于nodejs开发的博客系统,通过Apache L ...
- Head First 设计模式 —— 09. 模版方法 (Template Method) 模式
模板方法模式 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. P289 特点 主导算法框架,并且保护这个算法 P28 ...
- Java 安全之Weblogic 2017-3248分析
Java 安全之Weblogic 2017-3248分析 0x00 前言 在开头先来谈谈前面的绕过方式,前面的绕过方式分别使用了streamMessageImpl 和MarshalledObject对 ...
- SpringBoot启动报端口已被占用--解决
问题 启动SpringBoot项目后发现启动失败,控制台输出以下内容 Description: The Tomcat connector configured to listen on port 81 ...
- C语言实现蛇形矩阵
今天大一考试C语言的时候看见了这道题,下面是我转载的一个大佬的博客,自认为分析的很清楚,特来分享一下. **原文地址: https://blog.csdn.net/jack22333/article/ ...
- Openstack 启动一个实例(九)
Openstack 启动一个实例(九) 创建一个提供者网络: # 创建一个提供者网络: openstack network create --share --external --provider-p ...
- Linux复制某个目录下结构
Linux复制某个目录下结构 结合tree命令把当前目录下的文件夹路径存储到document.txt文件,然后再使用mkdir命令把document.txt文件下的目录输入创建: tree -fid ...