【问题标题】:How to call a method in a WSDL using SoapClient如何使用 SoapClient 在 WSDL 中调用方法
【发布时间】:2019-04-25 15:45:13
【问题描述】:

我在使用 SOAP 时遇到问题,我 100% 确定这是我的问题,而不是 Web 服务。

我可以成功连接到 wsdl。

$wsdl="http://webservices_qa.linksunlimited.com/LinksWebService.svc?wsdl";
$client = new SoapClient($wsdl, array('trace'=>1));
$functions = $client->__getFunctions();
var_dump($functions);

向我展示功能,以便我知道我可以使用它。

ini_set('default_socket_timeout', 2000000);

$wsdl="http://webservices_qa.linksunlimited.com/LinksWebService.svc?wsdl";

$client = new SoapClient($wsdl, array('trace'=>1));
$result = $client->GetProductCatalog((object)$links_credentials);
//$result = $client->GetProductCatalog($links_credentials); 
//$client->__soapCall("GetProductCatalog", $links_credentials);
//$result = $client->__soapCall("GetProductCatalog", (object)$links_credentials); //when i try this i get null

我预计会有很大的响应,大约 1.6MB。

我得到: 由于内部错误,服务器无法处理请求。有关该错误的更多信息,请在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪并检查服务器跟踪日志。

编辑:当我尝试时

$result = $client->__soapCall("GetProductCatalog",$links_credentials);

我得到“格式化程序在尝试反序列化消息时抛出异常:反序列化操作'GetProductCatalog'的请求消息正文时出错。应从命名空间'http://schemas.xmlsoap.org/soap/envelope/'结束元素'Body'。找到元素'param1'来自命名空间 ''。第 2 行,位置 158。"

我觉得我很接近......

【问题讨论】:

  • 听起来你也没有正确地请求方法
  • $links_credentials的内容是什么?它是如何构成的?是否识别tns:GetProductCatalog类型的定义?
  • 检查您在请求中发送的参数,即在您的情况下为 $link_credentials。所有参数都区分大小写,如果结构不正确,可能会导致内部服务器错误。使用 SoapUI 或 Boomerang 等 3rd 方 Soap API 工具来获取 wsdl 文件请求的正确语法

标签: php soap soap-client


【解决方案1】:

好的,问题是参数需要是多维的。所以最终看起来像

$result = $client->GetProductCatalog(array('requestCredentials'=>array('UserKey'=>$user, 'UserPassword'=>$pass)));
print_r($result->GetProductCatalogResult);

这在他们的文档中根本不明显。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2013-01-04
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多