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),有getSummary
、getKey
等方法等。如何在我的代码中使用这些功能?
根据我从互联网上找到的一些 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
中的数据字段。我们怎么知道我们可以从这个对象中获得key
、summary
等?我们怎么知道是->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 服务