我们使用现成的应用程序,该应用程序能够通过 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/