perl - 如何发送 SOAP 响应?

标签 perl soap

我们使用现成的应用程序,该应用程序能够通过 SOAP 调用发送 SMS 消息,但用户需要提供实际的 SMS 发送服务。

我编写了以下简单的 Perl 脚本(用于测试),该脚本可以工作(即成功接收 SMS 消息),但客户端总是提示 SMS 未发送。我想这是因为我没有发送 SOAP 响应。

我的问题是如何发送 SOAP 响应?

谢谢

#!/usr/bin/perl

use strict;
use warnings;

use SOAP::Transport::HTTP;
use Data::Dumper;

use lib '/tmp/';

SOAP::Transport::HTTP::CGI
    -> dispatch_to('Vendor::Telephony')
    -> handle();

package Vendor::Telephony;

sub SMS {
    my $name = shift;
    my $data = shift;
    my $message = $data->{'SMSMessage'};
    my $number = $data->{'SMSNumber'};

    open(SMS, " | sendmail -r alerts\@example.com $number\@sms.provider.com 2> /dev/null");
    print SMS $message;
    close(SMS);
}

编辑1: 我已经根据您的回答修改了我的脚本,但当我发出“返回”时,我总是在/var/log/httpd/access.log 中收到错误 500。错误 500 很简单: 172.23.34.18 - - [14/4/2019:09:24:16 +0800]“POST/cgi-bin/soap.cgi HTTP/1.1"500 1806 "-""Mozilla/4.0(兼容;MSIE 6.0;MS Web 服务客户端协议(protocol) 4.0.30319.42000)"

我使用 SOAP::WSDL 的 wsdl2perl 来创建 perl 模块。脚本现在看起来像:

#!/usr/bin/perl

use SOAP::Transport::HTTP;
use lib '/tmp/lib';
use Data::Dumper;

SOAP::Transport::HTTP::CGI
  ->dispatch_to('Vendor::Telephony')
  ->handle;
BEGIN {
  package Vendor::Telephony;
  use vars qw(@ISA);
  use MyElements::SMSResponse;
  @ISA = qw(Exporter SOAP::Server::Parameters);
  use SOAP::Lite;
  sub SMS {
    my ($self, $body, $header) = @_;
    my $message = $body->{'SMSMessage'};
    my $number = $body->{'SMSNumber'};

    open(SMS, " | sendmail -r alerts\@example.com $number\@sms.provider.com 2> /dev/null");
    print SMS $message;
    close(SMS);
    return MyElements::SMSResponse->new({Status => 0});
  }
}

最佳答案

请查看位于以下 URL 的 SOAP::Server 文档中的示例部分。

https://metacpan.org/pod/SOAP::Server

请注意,处理程序中的最后一条语句返回 SOAP::Data,但示例中似乎有一个小错误:该方法应该是 new(),而不是 name()。

本质上,您需要将响应构造为 SOAP::Data 对象并 return() 它。希望您已经知道响应的结构,因为我无法帮助您!

关于perl - 如何发送 SOAP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584662/

相关文章:

java - 如何从 Java 中的 SOAP 响应中提取数据?

php - 无法在 SOAP 上加载外部实体错误

perl - 如何使用Net::OpenSSH安全地写入远程文件

java - 如何在 Hibernate Java obj 中添加 @XmlTransient

PHP SOAP 请求不正确

perl - Perl 中的 AWK?我有一个 AWK 命令行。我不知道如何在 Perl 脚本中使用它

soap - SOAP 使用什么端口号?

c++ - c/c++中perl的hash变量替换

arrays - 如何删除数组的前五个元素?

perl - 命令 "cpan reports"到底是做什么的?