我正在使用LWP::UserAgent模塊向我們的 API 之一發出 GET 請求。
#!/usr/bin/perl
use strict;
use warning;
use LWP::UserAgent;
use Data::Dumper;
my $ua = LWP::UserAgent->new;
my $request = $ua->get("http://example.com/foo", Authorization => "Bearer abc123", Accept => "application/json" );
print Dumper $request->content;
請求成功。Dumper 回傳以下 JSON。
$VAR1 = '{
"apiVersion": "v1",
"data": {
"ca-bundle.crt": "-----BEGIN CERTIFICATE-----abc123-----END CERTIFICATE-----\\n"
},
"kind": "ConfigMap",
"metadata": {
"creationTimestamp": "2021-07-16T17:13:01Z",
"labels": {
"auth.openshift.io/managed-certificate-type": "ca-bundle"
},
"managedFields": [
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:data": {
".": {},
"f:ca-bundle.crt": {}
},
"f:metadata": {
"f:labels": {
".": {},
"f:auth.openshift.io/managed-certificate-type": {}
}
}
},
"manager": "cluster-kube-apiserver-operator",
"operation": "Update",
"time": "2021-09-14T17:07:39Z"
}
],
"name": "kube-control-plane-signer-ca",
"namespace": "openshift-kube-apiserver-operator",
"resourceVersion": "65461225",
"selfLink": "/api/v1/namespaces/openshift-kube-apiserver-operator/configmaps/kube-control-plane-signer-ca",
"uid": "f9aea067-1234-5678-9101-9d4073f5ae53"
}
}';
假設我想列印 apiVersion 鍵的值,它應該列印v1。
print "API Version = $request->content->{'apiVersion'} \n";
正在列印以下內容。我不確定如何列印值v1。由于 HTTP::Response 包含在輸出中,我懷疑我可能必須使用HTTP::Response 模塊?
API Version = HTTP::Response=HASH(0x2dffe80)->content->{'apiVersion'}
uj5u.com熱心網友回復:
必須首先解碼 JSON 內容。有幾個模塊,比如JSON:
use JSON;
# ...
my $href = decode_json $request->content;
然后像普通的哈希參考一樣使用它: $href->{apiVersion}
uj5u.com熱心網友回復:
Perl 不會在雙引號字串中擴展子例程呼叫。
print "API Version = $request->content->{'apiVersion'} \n";
在這行代碼中,content()是一個子程式呼叫。所以 Perl 認為:
print "API Version = $request" . "->content->{'apiVersion'} \n";
如果您嘗試列印大多數 Perl 物件,您將獲得散列參考以及類的名稱 - 因此HTTP::Response=HASH(0x2dffe80).
你可能認為你只需要print()像這樣分解你的陳述句:
print 'API Version = ', $request->content->{'apiVersion'}, "\n";
但這也行不通。$request->content不回傳 Perl 資料結構,它回傳一個 JSON 編碼的字串。您需要先將其解碼為資料結構,然后才能訪問各個元素。
use JSON;
print 'API Version = ', decode_json($request->content)->{'apiVersion'}, "\n";
但是在print()陳述句之外進行解碼可能會更清晰。
use JSON;
my $data = decode_json($request->content);
在這種情況下,您可以回傳更像原始代碼的內容:
print "API Version = $data->{'apiVersion'} \n";
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316245.html
標籤:json perl 卷曲 http响应 lwp-用户代理
上一篇:Perl評估范圍
下一篇:Perl可選捕獲組不起作用?
