#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 строка 22. Вы должны передать 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
вызов.