Служба Perl Soap с использованием wsdl

Я пытаюсь создать службу SOAP с помощью SOAP::Lite, но она не возвращает значение. Это дает ошибку использования неинициализированного значения $result в печати в строке 6 soap_client.pl.

<VirtualHost 192.168.1.187:80>
 ServerName perl.qlc.net
 ServerAlias www.perl.qlc.net
 DocumentRoot /web/perl.qlc.net/htdocs
 ErrorLog /var/log/httpd/perl.qlc.net_error_log
 TransferLog /var/log/httpd/perl.qlc.net_access_log
      <Directory "/web/perl.qlc.net/htdocs">
        <FilesMatch "\.mhtml$|\.pl$|\.html$">
                Options         +ExecCGI
                AddHandler      cgi-script .cgi .pl .html
                SetHandler      perl-script
                PerlHandler     ModPerl::Registry
                PerlSendHeader  On
        </FilesMatch>
      </Directory>
 DirectoryIndex index.phtml index.htm index.html index.php3 index.php
</VirtualHost>

Установленные модули perl:

MIME::Parser
SOAP::Lite

Модуль Apache:

mod_perl

Мыльный сервер: math.pl

#!/usr/bin/perl -w
use strict;
#use warnings;
use SOAP::Lite;
use SOAP::Transport::HTTP;

print "Content-type:text/xml\r\n\r\n";
#I have added above line because apache was throwing 500 error.

my $soap = SOAP::Transport::HTTP::CGI->new(
    dispatch_to => 'Arithmetic'
);
$soap->handle(); 

package Arithmetic;
sub add {
        return $_[1] + $_[2];
}
1;

Мыльный клиент: soap_client.pl

#!/usr/bin/perl -w
#use SOAP::Lite +trace =>'debug';
use SOAP::Lite;
my $result = 0;
my $client = SOAP::Lite->service("http://perl.qlc.net/math.wsdl");
print $result = $client->add(10, 20);

Файл Wsdl: math.wsdl

<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://perl.qlc.net/math.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloService" targetNamespace="http://perl.qlc.net/math.wsdl">
<message name="addRequest">
    <part name="operand1" type="xsd:float" />
    <part name="operand2" type="xsd:float" />
</message>
<message name="addResponse">
    <part name="response" type="xsd:float" />
</message>
<portType name="Hello_PortType">
    <operation name="add">
        <input message="tns:addRequest"/>
        <output message="tns:addResponse"/>
    </operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="add">
        <soap:operation soapAction="add"/>
        <input>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
        </input>
        <output>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
        </output>
    </operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
    <soap:address location="http://perl.qlc.net/math.pl"/>
</port>
</service>
</definitions>

Когда я запускаю soap_client.pl, он выдает следующую ошибку: Использование неинициализированного значения $result в печати в строке soap_client.pl 6. Я пытался это сделать в течение 2 дней, но не понял, где я делаю неправильно.


person pankaj ghadge    schedule 08.02.2013    source источник


Ответы (2)


Проблема была решена путем изменения math.wsdl Modified math.wsdl

<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:Arithmetic" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloService" targetNamespace="urn:Arithmetic" xmlns:y="urn:Arithmetic">
<message name="addRequest">
    <part name="operand1" type="xsd:float" />
    <part name="operand2" type="xsd:float" />
</message>
<message name="addResponse">
    <part name="response" type="xsd:float" />
</message>
<portType name="Hello_PortType">
    <operation name="add">
        <input message="tns:addRequest"/>
        <output message="tns:addResponse"/>
    </operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="add">
        <soap:operation soapAction="urn:Arithmetic#add"/>
        <input>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Arithmetic" use="encoded"/>
        </input>
        <output>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Arithmetic" use="encoded"/>
        </output>
    </operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
    <soap:address location="http://perl.qlc.net/math.pl"/>
</port>
</service>
</definitions>
person pankaj ghadge    schedule 08.02.2013

Вам нужно включить метод результата, чтобы получить результат:

$client->add(10, 20)->result;

Кроме того, вам, вероятно, следует добавить некоторую обработку ошибок, чтобы проверить, успешно ли выполнена команда, прежде чем использовать результат:

my $added = $client->add(10,20);
unless (defined $added)
{
    die "Failed add: $!";
}
$result = $added->result;

Кроме того, вы случайно не используете сервер .net? Документация Soap::Lite делает некоторые конкретные рекомендации в этом случае, и рекомендует не использовать вышеуказанный формат.

person Community    schedule 08.02.2013
comment
Выдает ошибку. Невозможно вызвать результат метода для неопределенного значения в строке soap_client.pl 6 - person pankaj ghadge; 08.02.2013
comment
@pankajghadge, что указывает на сбой исходной команды. После команды проверьте содержимое $!. - person ; 08.02.2013
comment
Если я позвоню серверу мыла php, используя тот же скрипт perl soap_client.pl. Это дает мне правильный результат. Я думаю, что что-то не так со сценарием мыльного сервера. - person pankaj ghadge; 08.02.2013