在Perl中设置http请求中的json字符串

oug3syen  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(179)

下面的Perl代码生成一个错误打印如下:

use strict;
use Data::Dumper;
use LWP::UserAgent;
use JSON;

my $token = 'my token';
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(PUT => "endpoint");
$req->header( 'Authorization' => "Bearer $token" );
$req->content_type('application/json');
$req->content('{"text":"whiteboard"}');
 
my $res = $ua->request($req);     
if ($res->is_success) {
    my $content = $res->decoded_content;
    my $fromjson = from_json($content);
    print Dumper $fromjson->{'results'}; 
}
else {
    print $res->status_line, "\n";
    print $res->content, "\n";
}

错误代码:

{"detail":[{"loc":["body"],"msg":"str type expected","type":"type_error.str"}]}

但是,如果我用Python写同样的代码,它就可以工作了:

import requests
import os
import json

url = 'endpoint'
token='my token'

headers = {
            "Authorization": "Bearer "+token[:-1],
            "Content-type" : "application/json"
            }
res=requests.put(url, json='{"text":"whiteboard"}', headers=headers)
#res=requests.put(url, json='test string', headers=headers) # this also works
print('Response Content:\n',res)

我在Perl代码中遗漏了什么?

dced5bon

dced5bon1#

我相信Perl正在发送JSON对象{"text":"whiteboard"}。Python正在发送JSON字符串"{\"text\":\"whiteboard\"}"
这个错误的意思是端点期望主体是一个JSON字符串,而不是一个JSON对象,所以只有Python代码才能工作。
你可能想要的是像$req->content(q["a string"])这样的东西。用ikegami's answer这样的JSON编码器编码会更安全。
在Perl代码中,$req->content('{"text":"whiteboard"}')只是发送字符串{"text":"whiteboard"}作为主体。
在Python代码中,res=requests.put(url, json='{"text":"whiteboard"}', headers=headers)将字符串{"text":"whiteboard"}序列化为JSON。主体是单个JSON字符串"{\"text\":\"whiteboard\"}"
从文件上看...
json -(可选)在请求体中发送的JSON可序列化Python对象。
如果你想发送一个JSON对象,你可以传递一个Python命令。

res=requests.put(url, json={"text":"whiteboard"}, headers=headers)

这将导致相同的错误。

wfauudbj

wfauudbj2#

Perl的等价物是

use Cpanel::JSON::XS qw( );

my $serializer = Cpanel::JSON::XS->new->utf8->allow_nonref;

$req->content( $serializer->encode( '{"text":"whiteboard"}' ) );

根据文档(搜索json=),

requests.put( url, json=payload )

相当于

import json

headers={ 'Content-Type': 'application/json' }
requests.put( url, data=json.dumps( payload ), headers=headers )

换句话说,提供给json的值是使用JSON编码的。这意味着以下是Python脚本发送的消息的正文:

"{\"text\":\"whiteboard\"}"

相关问题