Perl и сложный запрос SOAP

#perl #soap #soaplite

#perl #soap #soaplite

Вопрос:

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

 <?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')
 -> resu<
  

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

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

Комментарии:

1. Пожалуйста, опубликуйте код, который вы придумали на данный момент, даже если он работает неправильно.

2. code используйте SOAP::Lite; выведите SOAP::Lite -> uri(‘ webservices.uship.com/uShipsvc.asmx?WSDL ‘ ) -> прокси (‘http:/webservices.uship.com ‘) -> GetCategories(‘MyToken’) -> результат; code

3. извините, все еще привыкаю к stackoverflow, это возвращает 500 неверное имя хоста, 500 не удается подключиться к: 80 (неверное имя хоста «) в soap2.pl строка 2

4. Код в комментариях трудно читать. Вы можете отредактировать свой вопрос, чтобы включить его (используйте ссылку редактировать под списком тегов).

Ответ №1:

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

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

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

Комментарии:

1. code используйте SOAP::Lite; выведите SOAP::Lite -> uri(‘ webservices.uship.com/uShipsvc.asmx?WSDL ‘ ) -> прокси (‘http:/webservices.uship.com ‘) -> GetCategories(‘MyToken’) -> результат; возвращает 500 Не удается подключиться к:80 (неверное имя хоста «) в soap2.pl строка 2

2. Вы должны передать URL веб-службы в proxy() .

Ответ №2:

У меня были проблемы с выполнением вызовов 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() . "nt" . $rv->faultcode() . ": " . $rv->faultstring();
} else {
    print $rv->result();
}
  

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

используйте SOAP::Lite; выведите SOAP::Lite -> uri(‘webservices.uship.com/uShipsvc.asmx?WSDL ‘;) -> прокси(‘http:/webservices.uship.com ‘) -> GetCategories(‘MyToken’) -> результат;

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

Ответ №3:

Вам нужно исправить свои URI с помощью http:/webservices.uship.com I get 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')
 -> resu<
  

Ответ №4:

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

Вы можете включить эту инструкцию use в свою библиотеку / скрипт:

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

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