Perl и сложный SOAP-запрос - PullRequest
4 голосов
/ 12 апреля 2011

Мне нужно сделать несколько сложный запрос мыла, используя Perl, предпочтительно, используя SOAP::Lite. Я знаю, что служба активна и успешно вернула ошибки с другого конца. Вот мыльный запрос, который мне нужно сделать:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <GetCategories xmlns="http://webservices.uship.com">
        <token>string</token>
    </GetCategories>
</soap:Body>
</soap:Envelope>

Я исследовал это через Google, но безрезультатно.

Обновление : код, используемый до сих пор,

use SOAP::Lite; 
print SOAP::Lite
 -> uri('webservices.uship.com/uShipsvc.asmx?WSDL';)
 -> proxy('http:/webservices.uship.com')
 -> GetCategories('myToken')
 -> result;

Это возвращает

500 неверное имя хоста, 500 Не удается подключиться к: 80 (неверное имя хоста '') в строке soap2.pl 2

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

Из SOAP :: Lite's Руководство по началу работы ваш код должен выглядеть примерно так:

#!perl -w
use SOAP::Lite;
print SOAP::Lite                                            
  uri('http://www.soaplite.com/Temperatures')
  proxy('http://webservices.uship.com')
  GetCategories('string')
  result;

Подключите URI для возвращаемого объекта в uri()

1 голос
/ 20 декабря 2012

Вам нужно исправить ваши URI, с помощью http:/webservices.uship.com я получу 500 No Host option provided at test-soap.pl line 7.Измените это на это:

use SOAP::Lite; 
print SOAP::Lite
 -> uri('http://webservices.uship.com/uShipsvc.asmx?WSDL')
 -> proxy('http://webservices.uship.com')
 -> GetCategories('myToken')
 -> result;
1 голос
/ 28 июля 2011

У меня были проблемы с выполнением вызовов SOAP, потому что сервер, с которым я разговаривал, был .NET, который, очевидно, имеет проблемы со связью с SOAP :: Lite: http://msdn.microsoft.com/en-us/library/ms995764.aspx#soapliteperl_topic3

Даже если ваш сервер не является .NET, это еще один способ сделать ваш звонок (это работает для меня):

# proxy and uri strings should NOT have trialing slashes
my $_uri = 'http://youruri.com/whatever';
my $_proxy = 'http://yourproxy.com/something.asmx';
my $methodName = 'GetCategories';
my @params = (
        SOAP::Data->name( 'token'=>'string' ),
);

my $handle = SOAP::Lite
    ->uri( $_uri )
    ->proxy( $_proxy , timeout => 30, keep_alive => 1 )
    ->on_action( sub{ $_uri . "/" . $_[1] } );
my $method = SOAP::Data
    ->name( $methodName )
    ->attr( {xmlns => $_uri . "/"} );
my $rv = $handle->call( $method=>@params );
if( $rv->fault() ){
    print "SOAP Error ($methodName) :: " . $handle->transport()->status() . "\n\t" . $rv->faultcode() . ": " . $rv->faultstring();
} else {
    print $rv->result();
}

Кроме того, глядя на ваш комментарий к одному из ответов

codeuse SOAP :: Lite;напечатать SOAP :: Lite -> uri ('webservices.uship.com/uShipsvc.asmx?WSDL';) -> proxy ('http: /webservices.uship.com') -> GetCategories ('myToken') -> result;

У вас может быть URI и прокси в обратном направлении.Т.е. прокси должен быть вашим .asmx (без "? WSDL").Если вы хотите использовать WSDL, это совершенно другой способ подключения, чем использование прокси-сервера uri +.Смотри: http://guide.soaplite.com/#access%20with%20service%20description%20%28wsdl%29

0 голосов
/ 25 апреля 2012

Рассмотрите возможность использования SOAP :: Trace для отслеживания выполнения SOAP вызовов

Вы можете включить этот оператор использования в ваш lib / script:

use SOAP::Lite +trace => [qw/ debug method fault /];

Это может помочь вам отладить ваш SOAP вызов.

...