2014-11-24 126 views
0

我想是这样的:如何通过PHP中的SOAP访问Web服务?

try{ 

    $opts = array(
     'http'=>array(
      'user_agent' => 'PHPSoapClient' 
      ) 
     ); 

    $context = stream_context_create($opts); 
    $client = new SoapClient('http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl', 
          array('stream_context' => $context, 
            'cache_wsdl' => WSDL_CACHE_NONE)); 

          )); 
    print_r($client); 
} 
catch(Exception $e){ 
    echo $e->getMessage(); 
} 

和我的var_dump函数的结果是: SOAP的错误:解析WSDL:无法从加载....无法加载外部实体...

我怎样才能通过肥皂访问Web服务?谢谢。

这是XML的开头:enter image description here

+0

any?任何想法都欢迎:) – 2014-11-24 09:56:30

+0

我不认为你需要用户代理和上下文。看起来您无法读取WSDL,因为它受到基本身份验证的保护。看到我的答案的第二部分解决方案 – Konstantin 2014-11-24 10:27:32

+0

我从另一篇文章看到,我必须从php.ini启用extension = php_openssl.dll。我不得不提到它从一开始就启用了 – 2014-11-25 07:21:26

回答

0

首先:你提供所需的基本身份验证 URL。在使用HTTP基本认证时,PHP只会在调用服务时发送凭证,而不是在获取WSDL时发送凭证。

You CAN get a wsdl, if basic authentication is required

$login = 'xxx'; 
$password = 'xxx'; 

$client = new SoapClient(
    'http://' . urlencode($login) . ':' . urlencode($password) . '@83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl', 
    array(
     'login' => $login, 
     'password' => $password 
    ) 
); 

其次: 你的回报XML并不像有效的WSDL文件。请阅读SoapClient documentation page以了解正确的用法 - 对于非WSDL使用,new SoapClient()的第一个参数必须是WSDL文件的URI或null。 (这是一个example of WSDL file)可能需要在非WSDL模式下创建SoapClient?

+0

我更新了我的帖子。我认为这是链接:http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl。这个返回有效的WSDL – 2014-11-24 10:17:55

+0

请再次检查我的帖子 – 2014-11-24 10:19:56

+0

我用完全你的代码,我只是改变了密码和登录,但我仍然得到此消息“致命错误:未捕获SoapFault异常:[WSDL] SOAP错误:解析WSDL:”。 Thx帮助我,我真的Apping它它 – 2014-11-25 07:15:53

0

我刚刚从83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl下载了该文件。我保存在wsdl格式,现在我得到的功能

$client = new SoapClient("WebItem.wsdl", array('proxy_host'  => "83.166.204.26", 
              'proxy_port'  => 7147, 
              'proxy_login' => "xxxxxx", 
              'proxy_password' => "xxxxxxxx")); 
echo "<pre>"; var_dump($client->__getFunctions()); echo "</pre>";