【问题标题】:Getting the data from a SOAP Feed从 SOAP 提要中获取数据
【发布时间】:2017-04-24 23:14:30
【问题描述】:

我要开始说我对此一无所知。几天来我一直在研究代码,但我对 SOAP 提要束手无策。我查看了文档和视频以及其他堆栈溢出问题,但没有基本的了解,我只是没有拿起任何东西。

我有一份来自一家公司的文件,我正试图从中获取他们的提要,我希望将这些信息放入数据库中。他们给了我一些示例数据和 php 代码让我开始,但我无法让它工作。

<?php
require_once('../lib/nusoap.php'); // includes nusoap class
// Create object
$client = new nusoap_client('https://services.ironsolutions.com/SearchDataService/SearchDataService.asmx?wsdl', true); 
$client->setHeaders("<AuthHeader><Email>webservice@ironsolutions.com</UserName><Password>IRON123</Password></AuthHeader>"); 
// Call method -- for all equip use null instead of Array(...)
$result = $client->call('GetInventoryList', Array('type' => "TR", 'make' => "CIH"));

if ($client->fault) { // fault if any
   echo 'Fault'; print_r($result);
} else {
   // Check for errors
   $err = $client->getError();

   if ($err) { // Display the error
   echo 'Error' . $err ; }
   else { // Display the result echo 'Result';
   print_r($result); }
}
?>

现在我确实注意到在 AuthHeader 中它有一个电子邮件打开和一个用户名关闭,我不确定它实际上应该是哪个。无论我做什么,我的屏幕都显示为空白,因此很难排除故障。

这是获取信息的方式吗?有没有更简单的方法?这里发生了什么,只返回一个空白页?任何信息都会有所帮助。

【问题讨论】:

  • 如果您在浏览器 (https://services.ironsolutions.com/SearchDataService/SearchDataService.asmx?wsdl) 中将 URL 发送到 WSDL 文件,您可以看到消息定义。 &lt;AuthHeader&gt; 元素需要一个 &lt;Email&gt; 元素(不是 &lt;UserName&gt;。您是否确认您实际上可以在 PHP 之外调用该服务?我会先这样做 - 获取 SoapUI 或 PostMan 插件Chrome 并查看您是否可以调用该 URL 上的服务。

标签: php xml database soap nusoap


【解决方案1】:

如果您是 SOAP 新手,了解 Web 服务的最佳方法是使用已知良好的客户端实现来访问 Web 服务。这样你就知道如果出现问题,问题很可能出在服务器端。

SOAP UI 非常适合这类事情。在您的示例中,使用 SOAP UI 从 WSDL 创建了以下负载:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.ironsolutions.com">
   <soapenv:Header>
      <ser:AuthHeader>
         <ser:Password>IRON123</ser:Password>
         <ser:Email>webservice@ironsolutions.com</ser:Email>
      </ser:AuthHeader>
   </soapenv:Header>
   <soapenv:Body>
      <ser:GetInventoryList>
         <ser:p_type>TR</ser:p_type>
         <ser:p_make>CIH</ser:p_make>
      </ser:GetInventoryList>
   </soapenv:Body>
</soapenv:Envelope>

这表明您的示例存在 2 个问题:

  1. 标头确实格式不正确。 Email 是要使用的正确标签。
  2. 示例代码中的请求字段为 typemake,但根据 WSDL,应为 p_typep_make

如果我不得不猜测,产生的空白屏幕是由于服务器端在由于标头中的 XML 错误而无法反序列化 SOAP 消息时吃掉了异常。如果您查看 HTTP 响应,它可能是 500 错误,表明服务器已呕吐但错误页面/堆栈跟踪已关闭。

尝试使用 SOAP UI,让它工作,然后在您的 PHP 代码中重新创建 SOAP UI 消息。如果您想调试 PHP 客户端如何形成 SOAP 消息,SOAP UI 将允许您模拟该服务,以便您可以拦截和查看 PHP 生成的 SOAP 消息。

【讨论】:

  • 我不太确定如何使用 SoapUI,我下载了它,但我不知道在哪里提交 wsdl 或凭据。我已经修复了代码,我现在得到一个:Fault: Array ( [faultcode] => soap:Client [faultstring] => Unauthorized [detail] => ) 这是提交凭据的正确方法吗? $client->setHeaders("webservice@ironsolutions.comIRON123");
  • 这是我得到的结果,所以它可能正在工作。您只需要正确的凭据。我建议阅读有关如何使用 SoapUI 的信息;它将帮助您在与 Web 服务交互时提高效率。
  • 是的,我做了一些 youtube 教程并让它在以后工作。非常感谢。在我再次自己出去之前,还有一个问题,未经授权,这仅仅是因为用户名和密码可能是错误的,还是我需要确保在我的帐户上设置了另一个变量来读取信息?如果是这样,它会叫什么?
  • 我很确定是他们的服务器告诉您用户名/密码错误。您可能不得不询问托管 Web 服务的人员他们对用户名/密码的期望。如果您拥有正确的用户名/密码,那么除了您所做的工作之外,不应该有任何额外的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多