PHP如何消费SOAP web服务?

Posted

技术标签:

【中文标题】PHP如何消费SOAP web服务?【英文标题】:PHP how to consume SOAP web services? 【发布时间】:2011-12-03 03:58:57 【问题描述】:

我是使用网络服务的新手。感谢是否有人可以帮助我。

在我的 php 代码中,我尝试使用来自另一台服务器(JIRA、java)的 SOAP Web 服务。 JIRA SOAP API 显示为here。

$jirasoap = new SoapClient($jiraserver['url']);
$token = $jirasoap->login($jiraserver['username'], $jiraserver['password']);
$remoteissue = $jirasoap->getIssue($token, "issuekey");

我发现我的代码调用该页面上列出的函数没有问题。但是,我不知道如何使用 API 调用返回的对象。

我的问题是:

    在我的 PHP 代码中,如何在 SOAP API 调用返回的 Java 类对象中使用 methods? 例如,函数$remoteissue = $jirasoap->getIssue($a, $b) 将返回RemoteIssue。基于此(http://docs.atlassian.com/rpc-jira-plugin/latest/com/atlassian/jira/rpc/soap/beans/RemoteIssue.html),有getSummarygetKey等方法等。如何在我的代码中使用这些功能? 根据我从互联网上找到的一些 PHP 示例,似乎每个人都在使用这样的东西:$remoteissue = $jirasoap->getIssue($token, "issuekey");$key = $remoteissue->key; 他们没有使用对象的方法。 参考这个example,似乎有人可以用其他语言做到这一点。也可以用 PHP 完成吗? 我面临的问题是,我正在尝试获取附件的 ID。但是,我们似乎无法使用这种方法获取 Attachment ID:$attachmentid = $remoteattachment->id;。我正在尝试使用$remoteattachment->getId() 方法。

    在 PHP 代码中,当我们调用 SOAP API 并收到返回的对象后,我们如何知道该对象中有哪些数据字段可用? 例如,$remoteissue = $jirasoap->getIssue($token, "issuekey");$summary = $remoteissue->summary; 我们怎么知道->summary$remoteissue 中可用? 当我参考本文档(http://docs.atlassian.com/rpc-jira-plugin/latest/com/atlassian/jira/rpc/soap/beans/RemoteIssue.html)时,我没有看到它提到任何RemoteIssue 中的数据字段。我们怎么知道我们可以从这个对象中获得keysummary 等?我们怎么知道是->summary,而不是->getsummary?我们需要使用网络浏览器打开 WSDL URL?

谢谢。

【问题讨论】:

【参考方案1】:

这个问题已经有一年多了,但是为了分享知识并为有同样问题并找到此页面的人提供答案,这是我的发现。

问题中提到的文档是对 JiraSoapService 接口的概述。对于可以使用哪些参数调用哪些函数以及它们返回什么,这是一个很好的参考。

如果您为 Jira SoapClient 使用 Java,则返回的对象已实现,但如果您使用 PHP,则返回的对象不是本文档中所述的类型,并且没有提到的任何方法。返回的对象是内部 PHP 类 stdClass 的实例,它是未定义对象的占位符。了解返回内容的最佳方法是对从 SoapCalls 返回的对象使用 var_dump()

$jirasoap = new SoapClient($jiraserver['url']);
$token = $jirasoap->login($jiraserver['username'], $jiraserver['password']);
$remoteissue = $jirasoap->getIssue($token, "PROJ-1");

var_dump($remoteissue);
/* -- You will get something like this ---
object(stdClass)#2 (21) 
  ["id"]=> string(3) "100"
  ["affectsVersions"]=> array(0)   
  ["assignee"]=> string(4) "user"
...
  ["created"]=> string(24) "2012-12-13T09:27:49.934Z"
...
  ["description"]=> string(17) "issue description"
....
  ["key"]=> string(6) "PROJ-1"
  ["priority"]=> string(1) "3"
  ["project"]=> string(4) "PROJ"
  ["reporter"]=> string(4) "user"
  ["resolution"]=> NULL
  ["status"]=> string(1) "1"
  ["summary"]=> string(15) "Project issue 1"
  ["type"]=> string(1) "3"
  ["updated"]=> string(24) "2013-01-21T16:11:43.073Z"
  ["votes"]=> int(0)

*/

// You can access data like this:
$jiraKey = $remoteissue->key;
$jiraProject = $remoteissue->project;

【讨论】:

【参考方案2】:

您在 #2 中提到的文档是针对 Java 实现的,实际上并没有为您提供任何有关 PHP 的帮助。如果他们没有为他们的服务发布公共 API(这很不寻常),那么使用 WSDL 作为参考将使您知道服务接受了哪些对象和方法,并且您可以相应地计划您的方法调用。

您用来调用getIssue(...) 的技术看起来不错,但您应该考虑在SoapException 的情况下使用try...catch。

【讨论】:

【参考方案3】:

我在 .NET 项目中使用了 Jira SOAP,IntelliSense 提示我哪些字段可用于返回的对象。

如果您使用的是 Visual Studio,则可以使用 VS.Php for Visual Studio 或 Php for Visual Studio 之类的内容。

或者您可以从here 中选择一个支持 IntelliSense 的 IDE。

【讨论】:

以上是关于PHP如何消费SOAP web服务?的主要内容,如果未能解决你的问题,请参考以下文章

需要了解PHP中的SOAP 1.2 Web服务数据调用/发送

比较和对比 REST 和 SOAP Web 服务? [复制]

如何通过 AFNetworking 和 NSUrlSession 调用 SOAP Web 服务

PHP - 发送带有方法参数的 SOAP Web 服务

在 PHP 中使用 SOAP 协议调用 Web服务(WebService)

Web 服务 SOAP 请求适用于 SOAPUI,但不适用于 PHP