首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ruby/Perl Soap请求转换为PHP

将Ruby/Perl Soap请求转换为PHP
EN

Stack Overflow用户
提问于 2015-08-05 09:40:23
回答 1查看 245关注 0票数 1

我有一个Perl脚本,它可以与web soap服务器通信,并且做得很好。但是,我需要在PHP应用程序中获得相同的功能,并且在转换这一功能时遇到了很多困难。

工作的Perl如下所示:

代码语言:javascript
复制
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;

    }

并给出为会话生成客户端ID的预期结果。

以下脚本也在ruby中执行相同的操作:

代码语言:javascript
复制
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版本如下所示:

代码语言:javascript
复制
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对象(消息:受保护的=> SOAP-错误:解析WSDL:无法从'http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService‘加载外部实体"http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService“字符串:异常:私有=>代码:受保护的=> 0文件:受保护的=> /var/www/cgi-bin/test.php行:受保护的=> 7跟踪:异常:私有=>数组( =>数组(文件=> //var/www/cgi/test.php行) => 7函数=> SoapClient class => SoapClient类型的=> => SoapClient数组(#)( http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService )(以前):异常:私有=>故障字符串=> SOAP-错误:解析WSDL:无法从'http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService‘加载:未能加载外部实体"http://xx.x.xx.xx:8070/ShoreTelWebSDK/WebService“故障代码=> WSDL )

看起来是有问题加载WSDL,但是Perl脚本没有任何问题,我如何将其转换为PHP脚本?

我还尝试了下面的php脚本:

代码语言:javascript
复制
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);

这导致了服务器接受的所有可能请求的列表,但没有处理我的请求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-05 10:55:37

我最终能够在RobGudeon的帮助下完成这项工作。看起来我们需要使用Ruby版本的URL,这个URL与PHP所期望的相匹配。工作脚本是:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31828785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档