调用Feign接口报错:JSON parse error:Illegal character ((CTRL-CHAR, code 31))

简介: 调用Feign接口报错:JSON parse error:Illegal character ((CTRL-CHAR, code 31))

背景


在一个定时任务中,每隔一个小时会调用远程接口进行数据同步。本着“先实现,再优化”的原则,刚开始实现方式是在循环里每次调用远程接口,传入单条记录,因为每次都需要完成建立连接、数据传输、断开连接的操作,这样的话比较耗费网络与连接资源;后来测试没问题后,就改成了在循环完成后传入一个 List 进行批量操作,然后问题出现了。


10:12:28.881 [http-nio-8200-exec-3] ERROR c.y.c.s.h. GlobalExceptionHandler - [handleRuntimeException, 82] - 请求地址'/doit', 发生未知异常.org.springframework.http.converter. HttpMessageNotReadableException: JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens; nested exception is com.fasterxml.jackson.core. JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens


环境信息


用到的 OpenFeign 的版本信息:

image.png


问题分析


为什么每次传一条数据可以,但是传输列表的时候就出错了呢?


结合以前配置 Nginx 时的 gzip 压缩的经验,感觉这跟 Feign 的压缩配置有关系。可参考官方文档:docs.spring.io/spring-clou…


此时, Feign 的配置如下:

# feign 配置
feign:
  sentinel:
    enabled: true
  okhttp:
    enabled: true
  httpclient:
    enabled: false
  client:
    config:
      default:
        connectTimeout: 10000
        readTimeout: 10000
  compression:
    request:
      enabled: true
    response:
      enabled: true

从配置中,我们可以了解到当前配置开启了请求与响应的压缩功能。我们知道,什么时候进行压缩其实跟请求体的大小有关,如果本身请求的数据体较小,完全可以不进行压缩直接传输即可,这样可以节省压缩用的 CPU 资源;那么我们可以大胆地猜测:压缩是有一个阈值的,超过某个阈值才会进行压缩。这可以解释前面的疑问:为什么每次传一条数据可以,但是传输列表的时候就出错了呢?


解决方法


明确了问题的原因,解决起来就比较容易了。我们可以简单粗暴地将压缩关闭即可。。

image.png

Note:由于改成了批量传输的方式,导致业务处理耗时较长,在请求发起端可能出现"Timed out.."这类错误。这里的配置将 HTTP 连接的超时时间由10s修改成了60s;等数据同步完成,再改回来。


目录
相关文章
|
6天前
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
2月前
|
JSON 前端开发 JavaScript
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
这篇文章讨论了前端Vue应用向后端Spring Boot服务传输数据时发生的类型不匹配问题,即后端期望接收的字段类型为`int`,而前端实际传输的类型为`Boolean`,导致无法反序列化的问题,并提供了问题的诊断和解决方案。
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
|
2月前
|
JavaScript
NodeJs——Parsing error: Cannot read file '.../tsconfig.json'.eslint
NodeJs——Parsing error: Cannot read file '.../tsconfig.json'.eslint
17 0
|
4月前
|
JSON DataWorks 关系型数据库
DataWorks操作报错合集之同步Elasticsearch数据报错:Cat response did not contain a JSON Array,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
JSON 数据格式
Navicate数据报错之Bad Request,发送端口测试的时候,使用JSON字符串,而不是Text
Navicate数据报错之Bad Request,发送端口测试的时候,使用JSON字符串,而不是Text
|
3月前
|
JSON Java 数据格式
JSON parse error: Unexpected character (‘t‘ (code 116)): was expecting double-quote to start field n
JSON parse error: Unexpected character (‘t‘ (code 116)): was expecting double-quote to start field n
|
4月前
|
JSON 资源调度 Kubernetes
实时计算 Flink版操作报错合集之解析JSON数组时,遇到报错,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
107 0
|
2月前
|
存储 数据管理 数据库
|
5月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
下一篇
无影云桌面