使用openresty接收curl请求参数为true的问题

前段时间使用openresty网关接收请求时,总会有零星的500错误出现。查看日志发现是在参数校验的地方出错。服务的参数校验部分主要功能除了判断参数是否存在以外,还需要判断输入的文本长度,以确定走长文本逻辑还是短文本逻辑。部分代码如下:

ngx.req.read_body()
local post_args ,err = ngx.req.get_post_args()
ngx.log(ngx.INFO,string.format('post_args: %s',cjson.encode(post_args)))
if not post_args['content'] then
	--此处省略打印日志部分及结果处理部分
	ngx.say("error")
	ngx.exit(ngx.OK)
end
local text = post_args['content']
local textlen = util.get_strlen(text)
local long = false
if textlen > 200 then
    long = true
end

正常情况下这段代码是没有问题的,它做的事情包括:

1.获取参数
2.判断content字段是否存在
3.判断content是否超过200个字

但是在其他业务方使用java调用的时候会出现错误,报错信息为:

stack traceback:
coroutine 0:
    [builtin:len]: in function 'len'
    /home/app/xxx/nginx/lua-script/util.lua:306: in function 'get_strlen'
    ...p/xxx/nginx/lua-script/text-v2.lua:269: in function 'xxx'
    ...p/xxx/nginx/lua-script/text-v2.lua:346: in function <...p/xxx/nginx/lua-script/text-v2.lua:1>, client: 10.112.81.41, server: localhost, request: "POST /aa/text-v2 HTTP/1.1", host: "text.prd.xxx.xx"

入参打印出来后的结果为

post_args:{"content":true,"bid":"thisistest"}

参数为什么会出现bool型
在这里插入图片描述
后来通过交流,发现是调用方在被上游调用的时候content参数没有传,而他在编码的时候是使用java的map用于参数存储的。虽然不懂java,但问题好歹找到了,最重要的是可以复现了。
通过抓包,终于找到了参数传递的方式。对应的curl命令为:

curl --location --request POST 'http://localhost:8080/text' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'bid=3' --data-urlencode 'content'

终于找到了问题。始终让人疑惑的是为什么参数没有值,openresty里面却会默认给它赋值为true。造成代码里面参数校验时if not post_args["content"]这样的判断语句也会无法拦截。
接下来就可以解决问题了。让调用方改变调用方式或直接判断类型做参数拦截都可以

OpenResty是一个基于Nginx的Web应用服务器,它通过Lua脚本语言扩展了Nginx的功能。要使用OpenResty接收Protobuf请求,你需要进行以下步骤: 1. 安装OpenResty:首先,你需要在你的服务器上安装OpenResty。你可以从OpenResty的官方网站下载适合你操作系统的安装包,并按照官方文档的指引进行安装。 2. 配置Nginx:OpenResty是基于Nginx的,所以你需要配置Nginx来接收Protobuf请求。在Nginx的配置文件中,你需要添加一个location块来处理Protobuf请求。例如: ``` location /protobuf { default_type "application/x-protobuf"; content_by_lua_block { -- 在这里编写处理Protobuf请求的Lua代码 } } ``` 这个配置将会将所有以/protobuf开头的请求交给Lua代码处理,并将响应的Content-Type设置为application/x-protobuf。 3. 处理Protobuf请求:在content_by_lua_block中编写Lua代码来处理Protobuf请求。你可以使用Lua的protobuf库来解析和序列化Protobuf数据。以下是一个简单的示例: ```lua local protobuf = require "protobuf" -- 加载Protobuf定义文件 protobuf.register_file("path/to/your/protofile.proto") -- 处理Protobuf请求 ngx.req.read_body() local data = ngx.req.get_body_data() local message = protobuf.decode("YourProtoMessage", data) -- 在这里对message进行处理 -- 返回Protobuf响应 local response = { ... } -- 构建你的响应数据 local response_data = protobuf.encode("YourProtoMessage", response) ngx.say(response_data) ``` 在这个示例中,我们首先使用protobuf库加载Protobuf定义文件。然后,我们读取请求体中的数据,并使用protobuf库解码为Protobuf消息。接下来,你可以对解码后的消息进行处理。最后,我们构建响应数据,并使用protobuf库将其编码为二进制格式,然后通过ngx.say函数返回给客户端。 这就是使用OpenResty接收Protobuf请求的基本步骤。当然,具体的实现方式还取决于你的业务需求和Protobuf定义文件的结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值