【问题标题】:PHP SOAP Clients http headers ErrorPHP SOAP 客户端 http 标头错误
【发布时间】:2017-09-21 07:31:39
【问题描述】:

我需要在 PHP 中使用 Web 服务 https://www.example.com/example.svc?wsdl。为此,我正在使用 PHP SOAP 客户端。代码 sn-p 如下:

$client = new SoapClient("https://www.example.com/example.svc?wsdl",
    array('soap_version' => SOAP_1_2,
        'location'=>'https://www.example.com/example.svc',
        'login'=> '#####',
        'password'=> '#######',
        'exceptions'=>true,
        'trace'=>1,
        'cache_wsdl'=>WSDL_CACHE_NONE,
        'encoding'=>'UTF-8',
        'connection_timeout' => 500,
        'keep_alive' =>false));

$client->__call('getProductList',array());

但是,当我通过以下错误运行它时:

Warning: SoapClient::__doRequest(): SSL: The operation completed successfully. in E:\location\test1.php on line 37

Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in E:\location\test1:37 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://travius...', 'Travius/ITraviu...', 2, 0) #1 E:\location\test1(37): SoapClient->__call('getProductList', Array) #2 {main} thrown in E:\location\test1.php on line 37

我为解决错误而苦苦挣扎了几天,但无法弄清楚。我在堆栈溢出中尝试了不同的解决方案,例如'keep_alive' =&gt;falseconnection_timeout,但没有任何效果。

我也尝试使用 php nusoap 库。它的请求和响应如下:

Error

HTTP Error: Unsupported HTTP response status 400 Bad Request (soapclient->response has contents of the response)

Request

POST /#####.svc?wsdl HTTP/1.0
Host: #####.#####.eu
User-Agent: NuSOAP/0.9.5 (1.123)
Content-Type: application/soap+xml;charset=UTF-8; charset=UTF-8
SOAPAction: ""
Authorization: Basic RGVtb2FwaTpEdXE1dmRWdA==
Content-Length: 529

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><GetProduct><parameters><intProductID xsi:type="xsd:int">1266</intProductID><lang xsi:type="xsd:string">CN</lang></parameters></GetProduct></SOAP-ENV:Body></SOAP-ENV:Envelope>

Response

HTTP/1.1 400 Bad Request
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 02 Oct 2017 16:03:04 GMT
Content-Length: 0

请注意,此网络服务在 .Net 应用程序中运行良好。 任何帮助高度赞赏。提前致谢。

【问题讨论】:

  • 请详细说明“MySoapClient”的来源以及引发此错误的实际 WSDL。根据错误,您似乎正在使用 nusoap,它通常工作正常。
  • 你应该尝试使用原生 php soapclient 看看是否有帮助。您可以按照stackoverflow.com/questions/29934167/… 上的指南进行操作,它应该很容易测试。
  • 也可以看到有用户发现nusoap连接C#(.Net)的问题stackoverflow.com/questions/15402233/…
  • 您是否尝试将 WSDL 加载到 SOAPUI 之类的工具中?我还会询问 .Net 开发人员该合同是否与 .Net 之外的客户兼容。编写一个只能从 .Net 使用的 WCF 服务非常容易。
  • 当存在通信/网络/协议问题时,通常会出现此错误。您是否尝试过此处发布的解决方案:link

标签: php web-services wcf soap


【解决方案1】:

根据您在问题中发布的错误判断,请更改以下行。

$client->__call('getProductList',array());

像这样的东西

$client = false;
try {
$client = new SoapClient("https://www.example.com/example.svc?wsdl",
    array('soap_version' => SOAP_1_2,
        'location'=>'https://www.example.com/example.svc',
        'login'=> '#####',
        'password'=> '#######',
        'exceptions'=>true,
        'trace'=>1,
        'cache_wsdl'=>WSDL_CACHE_NONE,
        'encoding'=>'UTF-8',
        'connection_timeout' => 500,
        'keep_alive' =>false));
} catch (Exception $e) {
    exit("SoapClient Error \"".$e->getMessage()."\"");
}
if(!empty($client)) {
try {
        $soapResponse = $client->__soapCall('getProductList',array());
        var_dump($soapResponse);
    }  catch (SoapFault $e) { 
        exit("Error using method \"getProductList\" having errorCode \"".$e->faultcode."\"");
    }
}

我不知道您使用的是什么 php 版本(您尚未发布相关信息),但我认为在您的情况下 _call 已被弃用。

不推荐直接调用此方法。通常,SOAP 函数 可以作为SoapClient 对象的方法调用;在以下情况下 这是不可能的或需要其他选项,请使用 SoapClient::__soapCall().

【讨论】:

  • 我使用的是 php 5.6 版。我只是尝试使用 __soapCall() 但结果相同
  • @karim_fci 相同的结果是什么意思?整个 sn-p 被包裹在一个 try-catch 块中,所以脚本是否以消息 Error using method \"getProductList\" having errorCode \"".$e-&gt;faultcode."\" 退出?
  • @karim_fci 另外检查这篇文章php.net/manual/en/class.soapclient.php#116724 如果该示例中提到的 php 版本与您使用的完全匹配。
  • 实施您的解决方案时出现以下错误:警告:SoapClient::__doRequest(): SSL:操作成功完成。在第 48 行的 E:\location.php 中使用方法“getProductList”时出错,错误代码为“HTTP”
  • 根据您的最后一条评论参考解决方案收到此错误:SoapClient 错误 "SOAP-ERROR: Parsing WSDL: Couldn't load from 'example.com/example.svc?wsdl' : failed to load external entity "example.com/example.svc?wsdl" "
【解决方案2】:

您好,您是否尝试将您的 soap 标头写为 wssecurity you can see samples

或者这个in stackoverflow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多