java - 使用 SOAP Web 服务 - Java VS PHP

标签 java php web-services soap servicenow

一般性问题:

我们正在公司推出一个名为 ServiceNow 的新 ITSM 工具套件。 ServiceNow 提供了许多很好的开箱即用的 Web 服务。 目前我们正在实现一些与其他内部系统的接口(interface),并使用这些Webservices来消费Servicenow的数据。

我们如何在 PHP 中做到这一点:

<?php
$credentials = array('login'=>'user', 'password'=>'pass');
$client = new SoapClient("https://blah.com/incident.do?WSDL", $credentials);
$params = array('param1' => 'value1', 'param1' => 'value1');
$result = $client->__soapCall('getRecords', array('parameters' => $params));
// result array stored in $result->getRecordsResult
?>

就是这样! 5 分钟的工作,美丽而简单 - 从我的角度来看。

好的,现在在Java中也是一样:

我做了一些研究,似乎每个人都在使用 Apache Axis2 来使用 Java 中的 Web 服务。所以我决定走这条路。

  1. 安装 Apache Axis
  2. 打开 cygwin 或 cmd 并从 WSDL 生成类..WTF?干什么用的?

    $ ./wsdl2java.sh -uri https://blah.com/incident.do?WSDL

  3. 将生成的类复制到 Eclipse 中的 Java 项目。

  4. 使用此类:
ServiceNow_incidentStub proxy = new ServiceNow_incidentStub();

proxy._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
ServiceNow_incidentStub.GetRecords defectsGetRecords = new ServiceNow_incidentStub.GetRecords();
ServiceNow_incidentStub.GetRecordsResponse defectsResult = new ServiceNow_incidentStub.GetRecordsResponse();
proxy._getServiceClient().getOptions().setManageSession(true);
HttpTransportProperties.Authenticator basicAuthentication = new HttpTransportProperties.Authenticator();
basicAuthentication.setUsername("user");
basicAuthentication.setPassword("pass");
proxy._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, basicAuthentication);
defectsResult = proxy.getRecords(defectsGetRecords);
com.service_now.www.ServiceNow_incidentStub.GetRecordsResult_type0[] defects = defectsResult.getGetRecordsResult();

for (int j=0; j < defects.length; j++) {
    // do something
}

它可以工作,但我认为这种方式非常复杂.. 每当 wsdl 中的某些内容发生变化时 - 我必须使用 axis 重新编译它们。 无法全局配置诸如 Soap-endpoint 之类的东西。

Java 中是否有更简单的方法通过 WSDL 使用 SOAP?

最佳答案

首先:我完全同意。我在 Web 服务和 ServiceNow 方面做了很多工作,并且使用 Java 和/或 .Net 与使用脚本语言(我通常使用 Perl 来编写脚本)有很大不同。固有的问题是 WSDL 不应该经常更改,尤其是在生产中。 Java 和 .Net 的想法是,您获取这些 stub 类来进行编译时错误检查。

如果您当前处于 Ph1 阶段并且尚未部署 Prod,那么您应该真正研究 WSDL 更改的频率。然后从那里决定使用哪种技术。好处是,即使 WSDL 发生更改,将数据发布到实例 - 几乎所有字段都是可选的。所以如果添加一个新字段也没什么大不了的。当返回数据时(大多数情况下)会出现问题,因为如果返回的 XML 不在其期望的结构中,很多时候 java 和 .net 都会抛出异常。

许多人做的一件事是将模块设置为 CMDB 中的 CI,并通过更改请求模块维护其 ServiceNow 实例。这样,您的 java 应用程序将成为您正在查询的任何模块/表的下游 CI,并且当放入 CR 来修改该表时,您将立即知道这也会对您的内部应用程序产生影响。

不幸的是,你是对的,这是不同语言之间的权衡,根据我的经验,我们几乎无法改变这一点。

我忘记添加一件事,您的另一个选择是使用 JSON 服务。这将允许您向 SNC 实例发出原始请求,然后使用 JSON 解析器“即时”为您解析该数据。它消除了编译时检查,但也消除了 SOAP 系统的许多缺陷。

关于java - 使用 SOAP Web 服务 - Java VS PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879360/

相关文章:

java - 方法内出现 AsyncCallback 的 GWT Java 错误

java - 为什么临时变量与我从 arraylist.get 中得到的不一样?

java - Java 中的 JPanel 发生了什么?我究竟做错了什么?

PHP Paypal IPN : transaction not confirmed

c# - 如何从 C# web 服务生成 WSDL 文件

java - 如何使用java中的Twitter API获取去年至今的推文?

php - MySQL 更新 : Unexpected input field parameter in database query

php - 表单ajax在提交之前插入数据

javascript - 通过 JavaScript 访问 REST Web 服务

c# - ChannelFactory 引发的 WCF 异常