在 Perl 中接收通过 HTTP POST 发送的 XML 文档

Posted

技术标签:

【中文标题】在 Perl 中接收通过 HTTP POST 发送的 XML 文档【英文标题】:Receive an XML document sent through HTTP POST in Perl 【发布时间】: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 解析器 【参考方案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() 你的意思是:$ENVQUERY_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。

以上是关于在 Perl 中接收通过 HTTP POST 发送的 XML 文档的主要内容,如果未能解决你的问题,请参考以下文章

Python 通过 POST 接收 HTTP 文件

perl6 HTTP::UserAgent JSON

无法接收 Vue 通过 axios 发送到 PHP 的 Post 数据

后端接收不到AngularJs中$http.post发送的数据的问题

在 javascript 中的 HTTP POST 请求中发送 cookie

接收通过 POST 从 Javascript 发送到 PHP 的对象