Perl REST::Client 如何通过请求体JSON传递认证凭据?
问题根因与修复方案
核心错误定位
你触发服务端JSON request struct field is empty or invalid报错的核心原因,是Perl哈希构造的语法失误,导致最终生成的JSON结构和curl命令要求的嵌套结构完全不匹配。
Perl的哈希是扁平化键值存储结构,直接用圆括号列表作为嵌套key的对应值时,会自动把列表的内容拍平到哈希顶层,根本不会生成嵌套对象。你当前代码解析后实际生成的哈希结构等价于:
( 'auth_info' => 'username', 'myuser' => 'password', 'mypwd' => undef )
经过encode_json序列化后,生成的是完全不符合服务端要求的零散顶层字段,自然会被识别为无效结构。
修正实现步骤
替换嵌套结构的声明语法
嵌套哈希必须使用花括号{}声明匿名哈希引用作为内层值,不能直接用圆括号包裹的列表。修正后的 payload 构造代码如下:use JSON::XS qw(encode_json); my %CONTENT_JSON = ( 'auth_info' => { # 此处必须为{},不能用() 'username' => 'myuser', 'password' => 'mypwd' } ); my $CONTENT_JSON = encode_json(\%CONTENT_JSON);序列化完成后可以直接打印字符串验证,输出必须和curl命令中
-d参数的JSON完全一致:{"auth_info":{"username":"myuser","password":"mypwd"}}匹配REST::Client的请求头设置
按照服务端要求配齐两个核心请求头,移除之前适配HTTP Basic认证的会话头逻辑:Content-Type: application/jsonAccept: application/json
完整的请求发送逻辑参考:
use REST::Client; use JSON::XS qw(encode_json); my $client = REST::Client->new(); $client->addHeader('Content-Type', 'application/json'); $client->addHeader('Accept', 'application/json'); my $payload = encode_json({ auth_info => { username => 'myuser', password => 'mypwd' } }); # 发送认证请求 $client->POST('https://.../rest/v1.0/auth', $payload); # 打印返回内容排查 print "返回状态码:" . $client->responseCode() . "\n"; print "返回内容:" . $client->responseContent() . "\n";
附加排查提示
- 如果修正后仍报结构错误,优先打印序列化后的完整JSON字符串,逐字段和curl的请求体对比,确认没有字段名拼写错误、多余转义、层级缺失
- 该服务的JSON解析为严格模式,只要
auth_info节点缺失、或者username/password任意一个字段从auth_info内层被移到顶层,就会触发5437的结构无效报错
内容的提问来源于stack exchange,提问作者Denis.A
相关产品推荐
相关产品推荐

