【问题标题】:Receive an XML document sent through HTTP POST in Perl在 Perl 中接收通过 HTTP POST 发送的 XML 文档
【发布时间】:2012-03-08 08:40:45
【问题描述】:

我有一个通过 HTTP POST 发送给我的 XML 文档:

<?xml version="1.0" encoding="UTF-8" ?>
  <DeliveryNotification eventType="newMessage">
    <requestUid>sms9676187</requestUid>
    <sentMessageUid>sms29282896</sentMessageUid>
    ....
  </DeliveryNotification>

然后我使用 param() 子例程在 perl 脚本中收到:

#!/usr/bin/perl -w
use strict;
use CGI qw/param/;
use Data::Dumper;

my @xml = param();
warn Dumper(@xml);

当我转储我得到的结果时:

$VAR1 = '<?xml version';

每当文件遇到“=”符号时,它似乎都会破坏文件。如果我删除第一个 eqauls 符号进行测试,它只会在下一个符号处中断。这只能通过转义等号从发送数据的一方解决,还是我可以在 Perl 中做些什么?

【问题讨论】:

  • 如何发送数据? HTTP 请求的内容类型是什么?请求的正文是什么样的?
  • XML 如何在param() 的结果中结束?为什么 dio 要将这些结果存储到数组中?您想对返回的 XML 做什么?如果您需要查看其内容,请使用 XML 解析器。
  • 发送的数据就像一个后查询,但不是 "id=22111&name=xxx" 它是一个 XML 文档,因此是一个包含整个 XML 文档的字符串。我将它存储在一个数组中,因为当我将它存储在一个标量中时,我只会得到“1”。一旦我收到的数据完整并且在 = 符号后没有被截断,我将使用 XML 解析器

标签: xml perl http-post


【解决方案1】:

使用param('POSTDATA')

#!/usr/bin/perl -T
use strict;
use warnings FATAL => 'all';
use CGI qw();
my $cgi = CGI->new;
my $xml = $cgi->param('POSTDATA');

【讨论】:

  • 我试过那个,我只是得到了 $xml 值的“undef”
【解决方案2】:

我认为你的脚本看起来像:

#!env perl
use CGI qw( :standard );
use Data::Dumper;
my @xml = param();
warn Dumper(@xml);

param() 在查询字符串(GET 或 POST)中需要一个 url 编码的参数列表,并在列表上下文中返回参数的名称。

如果您只想要查询字符串中的原始数据(并且从不期望处理表单数据),请使用 query_string() 并通过 GET 请求提交 XML。

You can read the raw POST data via STDIN without using CGI, but there are caveats.

【讨论】:

  • 是的,这有点像我拥有的​​完整代码。我在我的问题中添加了更多内容以显示整个脚本。通过 query_string() 你的意思是:$ENV{QUERY_STRING}?似乎找不到 query_string() 子
  • use CGI qw( query_string );
  • 啊,完美!谢谢!使用 query_string() 获取所有内容
  • -1 query_string 不可能帮助处理 POST 数据,这是为 GET 设计的。 – 另外,Perlmonks 的文章已经过时了。同时,在 CGI.pm 中添加了用于访问请求正文的适当 API。
  • 嗨,daxim,我特别提到这仅适用于 GET 请求,而用于访问请求正文的 CGI API 不适用于 XML。
【解决方案3】:

你没有给我们太多的代码来查看,所以我们只能猜测是什么问题。 我“猜测”问题出在发送方。 HTTP POST 中的所有数据都需要进行 URL 编码。 而且由于 '=' 是一个不安全的字符,需要对其进行编码,这可能是您的问题。

有关 url 编码和 HTTP POST 的更多信息,请查看: enter link description here

【讨论】:

  • 我添加了更多代码。我还有一个 PHP 脚本,当发送 XML 的确切 HTTP POST 时会检索所有数据,所以我相信这是 PERL 方面的东西
  • 不,不是 HTTP POST 中的所有数据都需要进行 URL 编码。这仅适用于 Content-Type application/x-www-form-urlencoded,但问题显示 application/xml。
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2011-02-18
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多