http不返回数据,是超出了nginx返回的长度限制?还是有其他原因?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http不返回数据,是超出了nginx返回的长度限制?还是有其他原因?相关的知识,希望对你有一定的参考价值。

参考技术A 系统为了兼容emoji表情以及其他特殊符号,在数据传入时使用 urlencode() 函数处理了一下数据,并将处理后的数据保存到content字段,将原字符串存到content_bak字段,使用时将content字段先 urldecode() 一下,然后将整组数据 json_encode() 之后返回给前台。

接口一直没有任何数据返回,但http状态码为200

1.超出了nginx返回长度限制?
不对,因为直接使用 var_dump() 数组的时候是可以输出的,此输出也是nginx返回的。
2.发现 json_encode() 数组之后返回false
调试,使用 json_last_error() 函数获取错误码为 5 即对应为 JSON_ERROR_UTF8 ,说明数据里有非 utf8 的字符,是传入了一些不正常的字符吗?但就算不正常的字符也会被 urlencode() 然后存起来,所以应该不是数据内容有错误。
3.发现 json_encode() 之前的数组里有特殊的字符 � ,在对比content_bak数据看,原因基本已经确定。
因为 content , content_bak 这两个字段是使用 TEXT(mysql) 存的,由于此次数据非常长 urlencode() 之后,长度早已超出TEXT的最长长度 65535 ,所以只存到了 urlencode() 之后字符串的第65535位置,截取了半个字符,所以在 json_encode() 时出现了 JSON_ERROR_UTF8 这种错误。

修改字段类型就可以了从 TEXT 改为参照下表

微信小程序 wx.request 后端返回数据超出类型安全范围解决办法

遇到问题:

请求后端接口,发现返回的数据,文章的id被截断了,导致无法根据文章的id去获取文章详情,需要解决数据超出类型长度范围的问题。

解决办法:

  1. 联系后端,将接口返回的数据类型从 int 修改为 字符串 类型,这样就不会超出类型长度导致被截断了。

  2. 使用一些 包装类型处理包,如npm包中的 json-bigint,将请求返回的数据进行包装,使用的时候转成字符串使用。

3.使用数组进行分段处理,如下,使用时再转成拼接为字符串

4.采用正则,在JSON.parse之前将数值转换加上字符串双引号,这样就会解析成字符串了,如下图

题外话:如果是单页面程序中使用axios请求则需要在axios处理返回数据之前将数据进行包装处理。

axios处理方法:https://blog.csdn.net/Aaa_Liao/article/details/106982675

实际案例:
解决问题:

解决如下:
环境: 微信小程序开发
使用处理包装包:json-bigint
1.对请求数据手动处理,不使用微信请求的自动转换。

提示:

2.传给另外一个页面时的处理



3.页面收到数据,发起请求

以上是关于http不返回数据,是超出了nginx返回的长度限制?还是有其他原因?的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序 wx.request 后端返回数据超出类型安全范围解决办法

微服务架构—Nginx并发限流

nginx配置返回最大长度

高并发处理中缓存降级限流技术

Nginx返回大长度的JSON数据被截断

异步处理http请求同步返回结果