【问题标题】:check response status from LWP::UserAgent response [closed]从 LWP::UserAgent 响应检查响应状态 [关闭]
【发布时间】:2022-01-11 01:57:26
【问题描述】:

LWP::UserAgent 使用我们向端点发送请求,该端点以HTTP/1.1 200 OKHTTP/1.1 200 200 发送响应。我使用模式匹配来检查响应状态。

但我正在考虑使用一些通用函数来检查响应状态,而不是在 HTTP STATUS 中进行模式匹配。下面是我的代码。

use LWP::UserAgent;
my $ua = LWP::UserAgent->new( );
$ua->timeout(30);
my $req = HTTP::Request->new(POST => "$EndPoint");
$req->content_type('text/xml');
$req->content($send_data);
my $response = $ua->request($req);

my $http_status = '';
if ( $response =~ m/^HTTP.*?\s(.*)/ ) {
  $http_status = uc($1);  # It is probably already upper case -- just making sure.
}

if ( $http_status =~ m/200/ ) {
  if ( $response =~ m/Status=\"Successful\"/ ) {
    print "Successful\n";
  } else {
    my $error_code = '';
    if ( $response =~ m/Error Code=\"(.+?)\"/ ) {
      print  "Error: $1 \n";
    }
}

我尝试使用以下代码检查状态,但收到错误Can't locate object method "is_success" via package "HTTP/1.1 200 OK

 if($response->is_success){
      print Dumper($response);
     } else {
      print Dumper($response->status_line);
     }

编辑

perl send_request.pl
Can't locate object method "is_success" via package "HTTP/1.1 200 OK

##我在 $response 上添加了一个打印件

  Connection: close
    Date: Mon, 10 Jan 2022 17:36:58 GMT
    Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Server: Apache
    Vary: Accept-Encoding
    Content-Length: 356
    Content-Type: text/xml;charset=utf-8
    Client-Date: Mon, 10 Jan 2022 17:36:58 GMT
    Client-Peer: XXXXX
    Client-Response-Num: 1
    SOAPAction: ""

【问题讨论】:

  • 我是 LWP 的维护者。这可能是 LWP::UserAgent 中的一个错误。 $ua->request 应该返回一个 HTTP::Response 对象。我认为理想情况下,您会在github.com/libwww-perl/libwww-perl/issues 上提出票证并添加更多详细信息,例如您正在运行哪个版本的 LWP::UserAgent,以及您发送的请求的响应正文(或至少是标头)是什么.谢谢。
  • Re "Can't locate object method "is_success" via package",不,在您发布的代码中使用$response->is_success 不会导致该错误。跨度>
  • 请停止添加虚假信息。您已经有一个无法运行的程序,现在您添加了无法获得的输出。请编辑您的问题以包含问题的实际演示。如果您发布的内容是虚构的,我们将无法帮助您。
  • Re "你是什么意思?",你发布的代码不是你运行的代码。它不包括导致您遇到您所询问的错误的错误。你发布的输出不是你得到的输出。 (输出部分已被修复。)
  • Re "我不知道你想要什么证明",一个实际输出Can't locate object method "is_success" [...]的程序,供初学者使用。见minimal reproducible example。 // Re "但这不是编造的",请不要说谎。这不是你运行的程序。它甚至不包括$response->is_success

标签: perl


【解决方案1】:

不要对响应进行字符串化,然后使用模式匹配。请改用提供的方法。

要检查 2xx 代码:

if ( $response->is_success ) { ... }

专门检查 200(在极少数情况下,您想区分 200 OK201 Created),

if ( $response->code == 200 ) { ... }

如果你想要后面的字符串,你可以使用

$response->status_line   # "200 OK" or "200 200"

【讨论】:

  • 无法通过 /usr/share/perl5/vendor_perl/HTTP/Message.pm 第 658 行的包“HTTP::Headers”定位对象方法“status_code”。
  • 我的错,应该是code。 (已修复。)但你不应该使用那条线。为什么您认为这是您要检查 201 的罕见情况?
  • 我不想进行模式匹配,因为第三方 tomcat 服务可以发送像 200 200 或 200 OK 这样的响应。所以我试图找到一个可以做到这一点的通用方法
  • “行”是指“我发布的用于检查代码的代码行”...
【解决方案2】:

有一些方法可以查询响应,你很少需要解析它的消息。

LWP::UserAgent::get 返回一个HTTP::Response 对象。在其文档中,我们发现

is_successis_infois_erroris_client_erroris_server_erroris_redirect

最常用的是is_success,提纲中有一个例子。

HTTP::Status 中有关这些确切含义的更多详细信息

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 2011-06-02
    • 2023-03-04
    • 2016-06-16
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多