【发布时间】:2019-04-09 03:24:52
【问题描述】:
我们使用现成的应用程序,它能够通过 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:
我已经根据您的回答修改了我的脚本,但是当我发出“return”时,我总是在 /var/log/httpd/access.log 中收到错误 500。错误 500 很简单:
172.23.34.18 - - [14/Apr/2019:09:24:16 +0800] "POST /cgi-bin/soap.cgi
HTTP/1.1" 500 1806 "-" "Mozilla/4.0 (compatible; MSIE 6.0; MS Web
Services Client 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});
}
}
【问题讨论】:
-
您似乎忽略了“使用”您的“MyElements::SMSResponse”包,因此返回将失败,但您需要告诉我们报告中的内容Apache 错误日志是肯定的。
-
再次感谢您,目前已更新代码以反映脚本。
-
你做了很多改变,事情变得一团糟。如果它仍然不起作用,您需要告诉我们 /var/log/httpd/error.log 中的错误消息是什么
-
抱歉,实际上没有任何内容写入error.log,只有access.log。我注意到,如果我删除他“返回”,http 状态会从 500 更改为 200,但 Windows 客户端仍然会抱怨。我会再次戳供应商,希望他们会开始提供帮助。同时,感谢您的帮助。
-
错误和警告应该记录在某处。你有什么方法可以从程序中生成调试输出吗?你不会让这项工作变得盲目。