调用 WSDL 提供的函数时,PHP 5 SOAP 客户端返回 NULL

标签 php xml web-services soap wsdl

我正在尝试使用网络服务从我的 PHP 应用程序中查找特定用户。我在 ASP.NET 中成功地使用了完全相同的 Web 服务。

基本上,我按照 PHP 文档告诉我的方式进行所有操作,并且使用与 ASP.NET 中相同的方法/变量(对于网络服务本身),但我似乎无法获得结果。

该函数在 __getFunctions() 中列出并且应该返回 anyType,如果我理解正确的话,这相当于 PHP 中的 mixed:

array(1) { [0]=>  string(63) "anyType basicSearch(string $sharedSecret, string $searchParams)" } 

当我调用 basicSearch() 时,它似乎返回 NULL。

basicSearch() 应该返回包含信息的 XML 文档。在 ASP.NET 中,我曾经简单地将响应转换为 XmlDocument。我也应该在 PHP 中这样做吗?使用哪种 XML 文档表示(SimpleXML、DOM 等)?

会不会因为PHP无法理解格式就显示为NULL?

我在 PHP 中做错了什么吗?或者我应该查看 Web 服务本身并尝试在那边进行调试?

<?php
    $client = new SoapClient($wsdl_url);

    echo $client->__getFunctions();
    echo "<br />\n";
    echo $client->basicSearch($key, $req);
?>

PS:我使用的是 PHP 5 库。也许使用像 nu-soap 这样的其他库会有帮助吗?网上似乎有更多关于它的文档。


更新:

使用数组传递参数不起作用,SOAP 需要单独的参数。调用 __getLastRequest() 返回一个连接 $key 和 $req 的字符串,没有其他 XML。调用 __getLastResponse() 返回一个空字符串。不会抛出任何异常。似乎 PHP 不知道如何处理我给它的参数,即使它已经解析了 WSDL 文件,因为我在调用 __getFunctions() 时列出了我使用的函数。

如有任何帮助,我们将不胜感激。

更新':仍然没有有效的解决方案。我很困惑...

最佳答案

当我开始在 php 中使用 SoapClient 库时,我发现整个事情非常困惑。格式化这些东西的正确方法如下:

$client = new SoapClient( $wsdl_url, array( "trace" => 1 ) );

$params = array(
    "sharedSecret" => "thisIsSomeSecret",
    "searchParams" => "thisIsSomeSearchParam"
);

$response = $client->basicSearch( $params );

没有看到响应,我无法告诉您如何引用返回参数,但它的存储方式是作为 stdClass 对象的成员 var。这样你就可以像这样引用返回......

$reponse->paramName;

如果您保留数组(“trace”=> 1)选项集,一个不错的技巧是您可以调用这两个函数....

$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();

...查看发送出去的实际 xml,查看其格式是否正确。小心,SoapClient 有很多问题。虽然比 nusoap 好得多,但不要去找那些垃圾。

关于调用 WSDL 提供的函数时,PHP 5 SOAP 客户端返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1328878/

相关文章:

php - 我使用循环填充 <select> 选项,如何使选择框显示当前选项而不是最高值?

PHP '//' 的含义

php - SQL/PHP-语法错误或访问冲突: 1064 You have an error in your SQL syntax; [closed]

PHP 对象在变量名中有分号(或其他奇怪的字符)

php - 在 php 中添加逗号作为千位分隔符和 float

xml - 如何使用 XPath 根据条件获取包含默认命名空间的 XML 中的特定元素

c# - 解析包含非法字符的 XML

python - 如何通过cron停止ffmpeg直播到youtube?

java - 用于修改请求和响应内容的 Servlet 过滤器与 CXF 拦截器?

c# - aspnet c# webservice session 、httpcontext 和 hack