Как отправить ответ SOAP? - PullRequest
2 голосов
/ 09 апреля 2019

Мы используем готовое приложение, которое способно отправлять SMS-сообщения через вызовы SOAP, но пользователю необходимо предоставить реальную услугу отправки 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);
}

EDIT1: Я изменил свой сценарий на основе вашего ответа, но всегда получаю ошибку 500 в /var/log/httpd/access.log при выдаче 'return'.Ошибка 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)"

Я использовал wsdl2perl SOAP :: WSDL для создания модулей 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});
  }
}

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Посмотрите раздел Пример в документации по SOAP :: Server по следующему URL.

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

Обратите внимание, что последний оператор в обработчике возвращает SOAP :: Data, за исключением того, что в примере есть небольшая ошибка: метод должен быть new (), а не name ().

По сути, вам нужно создать свой ответ как объект SOAP :: Data и вернуть его (). Надеюсь, вы уже знаете, как должен быть структурирован ответ, потому что я не могу вам помочь с этим!

0 голосов
/ 14 апреля 2019

Мне нужно больше узнать о библиотеке, чтобы дать «хороший» ответ, но, глядя на:

#!/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/, которая очень помогла процессу тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...