douejuan9162 2013-01-17 17:17
浏览 111

php soap客户端,来自坏wsdl的错误? “未捕获的SoapFault异常:[HTTP]无法连接到主机”

I'm mostly new to SOAP, so I made a little test script to connect to my customer's server. They have a GetMessage command in there, that requires no input or authentication and is just intended to test connectivity:

<?php
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);

$url        = "https://test.mycustomer.com/api/TestService.svc?wsdl";
$client     = new SoapClient($url, array("trace" => 1, "exception" => 0));

$result = $client->GetMessage(NULL);

echo "<pre>".print_r($result, true)."</pre>";
if($result->GetMessageResult->Status == "Success")
{
    echo "Item deleted!";
}
?>

If I run this in the command line I get:

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in /var/www/my.stage.com/htdocs/common/soaptest.php:8
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://459265-d...', 'http://tempuri....', 1, 0)
#1 [internal function]: SoapClient->__call('GetMessage', Array)
#2 /var/www/my.stage.com/htdocs/common/soaptest.php(8): SoapClient->GetMessage(NULL)
#3 {main}
  thrown in /var/www/my.stage.com/htdocs/common/soaptest.php on line 8

And from a browser I get:

PHP Notice: 'SoapClient::__doRequest() [soapclient.--dorequest]: php_network_getaddresses: getaddrinfo failed: Name or service not known' 

In their WSDL for this service, the string "459265" appears here:

<wsdl:service name="TestService">
<wsdl:port name="BasicHttpBinding_ITestService" binding="tns:BasicHttpBinding_ITestService">
<soap:address location="http://459265-dev1/api/TestService.svc"/>
</wsdl:port>
<wsdl:port name="BasicHttpsBinding_ITestService" binding="tns:BasicHttpsBinding_ITestService">
<soap:address location="https://test.mycustomer.com/api/TestService.svc"/>
</wsdl:port>
</wsdl:service>

So my question is, is that correct? Should the WSDL have a local url like that, that I can't get to from my box?

A little more info, when I do a var_dump on __getFunctions and __getTypes, I get

array(2) {
  [0]=>
  string(53) "GetMessageResponse GetMessage(GetMessage $parameters)"
  [1]=>
  string(53) "GetMessageResponse GetMessage(GetMessage $parameters)"
}
array(5) {
  [0]=>
  string(21) "struct GetMessage {
}"
  [1]=>
  string(55) "struct GetMessageResponse {
 string GetMessageResult;
}"
  [2]=>
  string(8) "int char"
  [3]=>
  string(17) "duration duration"
  [4]=>
  string(11) "string guid"
}
  • 写回答

2条回答 默认 最新

  • duanbin198788 2013-01-17 17:25
    关注

    What you want to do is wrap your code in a try{}, catch{} block. For example,

    <?php
        try {
            ini_set('soap.wsdl_cache_enabled',0);
            ini_set('soap.wsdl_cache_ttl',0);
    
            $url = "https://test.mycustomer.com/api/TestService.asmx?wsdl";
            $client = new SoapClient($url, array("trace" => 1, "exception" => 0));
    
            $result = $client->GetMessage(NULL);
    
            echo "<pre>".print_r($result, true)."</pre>";
            if($result->GetMessageResult->Status == "Success")
            {
                echo "Item deleted!";
            }
        }
        catch (SoapFault $exception) {
            echo $exception->getMessage();
        }
    ?>
    

    As the error says, Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in ...., so you need to catch the exception in any case. Hope this helps.

    评论

报告相同问题?

悬赏问题

  • ¥15 Oracle触发器记录修改前后的字段值
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器