You need to enable JavaScript to run this app. Perl REST::Client 如何通过请求体JSON传递认证凭据?
优惠活动
大模型
产品
解决方案
定价
更多

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序列化后,生成的是完全不符合服务端要求的零散顶层字段,自然会被识别为无效结构。

修正实现步骤

  1. 替换嵌套结构的声明语法
    嵌套哈希必须使用花括号{}声明匿名哈希引用作为内层值,不能直接用圆括号包裹的列表。修正后的 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"}}
    
  2. 匹配REST::Client的请求头设置
    按照服务端要求配齐两个核心请求头,移除之前适配HTTP Basic认证的会话头逻辑:

    • Content-Type: application/json
    • Accept: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 08:06:06