Преобразование запроса на мыло Ruby / Perl в PHP

1

У меня есть скрипт Perl, который взаимодействует с веб-сервером soap и отлично работает. Однако мне нужно получить эту же функциональность в приложении PHP, и у меня много проблем с этим.

Рабочий Perl выглядит так:

use warnings;
use SOAP::Lite;
use CGI;
use Data::Dumper;
sub  trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
print "Content-type:text/html\n\n";

# Use SoapLite to create a connection to our Web service.  URI is the namespace for our service,
# proxy is the endpoint of our service.  The "on_action" is necessary to reformat SoapLite's
# SOAP request to match what a .NET service needs.

my $myWebService = SOAP::Lite
  -> uri('http://www.ShoreTel.com/ProServices/SDK/Web')
  -> proxy('http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService')
  -> on_action(sub {sprintf '%s/ShoreTelWebService/%s', $_[0], $_[1]});

my $query = new CGI;
my $ip = $query->remote_host;                    # IP address of remote party...use later as unique identifier


    # To use our service, we need to register ourselves as a client...use remote IP address
    # as a unique name for association to this session.

    my $regClientResult = $myWebService->RegisterClient(SOAP::Data->name('clientName' => $ip));
    if ($regClientResult->fault)
    {
      print '<p>FAULT', $myClientID->faultcode, ', ', $myClientID->faultstring;
    }
    else
    {
      # Retrieve client ID which we will be using for subsequent communication.

      $myClientID = $regClientResult->valueof('//RegisterClientResponse/RegisterClientResult/');
      print $myClientID;

    }

И дает ожидаемый результат создания идентификатора клиента для сеанса.

Следующий сценарий также делает то же самое в рубине:

require "soap/wsdlDriver"
require 'optparse'
require 'ostruct'
require 'pp'


def has_events(events)
  return (events["GetEventsResult"] != nil) && (events["GetEventsResult"]["ShoreTelEventBase"] != nil)
end



begin
  options.parse!(ARGV)
rescue OptionParser::ParseError => e
  puts e
end

# create wsdl driver for SDK
wsdl = "http://10.1.10.20:8070/ShoreTelWebSDK?wsdl"
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
driver.wiredump_file_base = "/var/www/WebSDK.out"

# register with the SDK
id = driver.RegisterClient("clientName" =>"ruby")
handle = id.registerClientResult
print "\nClient ID ", handle, " has been registered.\n\n"

Однако попытка в версии php выглядит так:

try
{
$soap_url = 'http://10.1.10.20:8070/ShoreTelWebSDK/WebService';
$client = new SoapClient($soap_url);

$header = new SoapHeader(

        'http://www.ShoreTel.com/ProServices/SDK/Web',
        'RegisterClient',
        array(
            'clientName' => 'xx.xx.xx.xxx'
        )
    );
    $client->__setSoapHeaders($header);
    var_dump($client->__getFunctions());    
}
catch (Exception $e)
{
   print_r($e);
}

И дает следующие ошибки:

Объект SoapFault ([сообщение: protected] => SOAP-ERROR: анализ WSDL: не удалось загрузить из " http://xx.x.xx.xx: 8070/ShoreTelWebSDK/WebService ": не удалось загрузить внешний объект " http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService "[string: Exception: private] => [code: protected] => 0 [файл: protected] =>/var/www/cgi-bin/test.php [line: protected] => 7 [trace: Exception: private] => Array ([0] => Array ([file] =>/var/www/cgi-bin/test.php [line] => 7 [function] => SoapClient [класс] => SoapClient [type] => → [args] => Array ([0] => http://xx.x.xx.xx: 8070/ShoreTelWebSDK/WebService) )) [previous: Exception: private] => [faultstring] => SOAP-ERROR: Разбор WSDL: не удалось загрузить с ' http://xx.x.xx.xx: 8070/ShoreTelWebSDK/WebService ': не удалось загрузить внешний объект " http://xx.x.xx.xx: 8070/ShoreTelWebSDK/WebService " [faultcode] => WSDL)

Похоже, что у него проблемы с загрузкой WSDL, но у Perl-скрипта нет никаких проблем, как я могу перевести это на PHP-скрипт?

Я также попробовал скрипт php следующим образом:

try
{
$soap_url = 'http://10.1.10.20:8070/ShoreTelWebSDK?wsdl';
$client = new SOAPClient($soap_url, array( 'proxy_host' => '10.1.10.20', 'proxy_port' => 8070, 'trace' => 1 ) );
$client = new SoapClient($soap_url);

$header = new SoapHeader(

        'http://www.ShoreTel.com/ProServices/SDK/Web',
        'RegisterClient',
        array(
            'clientName' => 'xx.x.xx.xxx'
        )
    );
    $client->__setSoapHeaders($header);
    var_dump($client->__getFunctions());    
}
catch (Exception $e)
{
   print_r($e);

Это привело к списку всех возможных запросов, которые принимает сервер, но не обработал мой запрос.

  • 1
    Perl работает на том же сервере и как тот же пользователь? вам нужно установить прокси-сервер? что произойдет, если вы попробуете wget 10.1.10.20:8070/ShoreTelWebSDK/WebService в качестве того же пользователя, с которым вы запускаете скрипт php?
  • 0
    @RobGudgeon Да, это один и тот же сервер. Это не должен быть прокси, так как он работает со скриптом Perl. Wget приводит к ошибке. Я не уверен, как сценарий Perl тянет его, который работает.
Показать ещё 6 комментариев
Теги:
soap

1 ответ

1
Лучший ответ

Я, наконец, смог сделать эту работу с помощью RobGudeon. Похоже, нам нужно было использовать URL-адрес версии Ruby, которая соответствовала ожидаемому PHP. Рабочий сценарий:

try
{
$soap_url = 'http://xx.x.xx.xx:8070/ShoreTelWebSDK?wsdl';
$client = new SOAPClient($soap_url, array( 'proxy_host' => 'xx.x.xx.xx', 'proxy_port' => 8070, 'trace' => 1 ) );
$client = new SoapClient($soap_url);

$header = new SoapHeader(

        'http://www.ShoreTel.com/ProServices/SDK/Web',
        'RegisterClient'

    );
    $client->__setSoapHeaders($header);
    var_dump($client->RegisterClient(array(
            'clientName' => 'xx.xx.xx'
        )));    
}
catch (Exception $e)
{
   print_r($e);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню