【问题标题】:How to send SOAP response?如何发送 SOAP 响应?
【发布时间】: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 客户端仍然会抱怨。我会再次戳供应商,希望他们会开始提供帮助。同时,感谢您的帮助。
  • 错误和警告应该记录在某处。你有什么方法可以从程序中生成调试输出吗?你不会让这项工作变得盲目。

标签: perl soap


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复,我已做出“编辑 1”作为回应
  • 谢谢你仍然没有,但你提供了巨大的帮助,所以我奖励了赏金。谢谢。
【解决方案2】:

我需要了解更多关于图书馆的信息才能提供一个“好的”答案,但是,看看:

#!/usr/bin/perl use SOAP::Transport::HTTP; 
   SOAP::Transport::HTTP::CGI   
    ->dispatch_to('C2FService')   
    ->handle; BEGIN {   package C2FService;   

use vars qw(@ISA);   
@ISA = qw(Exporter SOAP::Server::Parameters);  

use SOAP::Lite;   
sub c2f {
         my $self = shift;
         my $envelope = pop;
         my $temp = $envelope->dataof("//c2f/temperature");
         return SOAP::Data->name('convertedTemp' => (((9/5)*($temp->value)) + 32));   } }

看看return,它以SOAP 开头,因此提供(如果我没记错的话是一个有效的信封。我已经有一段时间没有SOAP::Lite 了,但我记得使用https://www.soapui.org/极大地帮助了测试过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多