调用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;等数据同步完成,再改回来。


目录
相关文章
|
9月前
|
监控 数据挖掘 API
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
227 0
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1733 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
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
|
JSON 数据格式
Navicate数据报错之Bad Request,发送端口测试的时候,使用JSON字符串,而不是Text
Navicate数据报错之Bad Request,发送端口测试的时候,使用JSON字符串,而不是Text
|
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
|
9月前
|
机器学习/深度学习 JSON 监控
淘宝拍立淘按图搜索与商品详情API的JSON数据返回详解
通过调用taobao.item.get接口,获取商品标题、价格、销量、SKU、图片、属性、促销信息等全量数据。
|
8月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
8月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
8月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。

热门文章

最新文章