2

一般的な質問:

弊社では、ServiceNowという新しいITSMToolsuiteをリリースします。ServiceNowは、すぐに使用できる多くの優れたWebサービスを提供します。現在、他の内部システムへのいくつかのインターフェースを実装しており、これらのWebサービスを使用して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でも同じです。

私はいくつかの調査を行いましたが、誰もがJavaでWebサービスを利用するためにApacheAxis2を使用しているようです。それで私はその道を行くことにしました。

  1. ApacheAxisをインストールします
  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を使用する簡単な方法はありますか?

4

4 に答える 4

2

まず最初に:私は完全に同意します。私はWebサービスとServiceNowでかなりの作業を行っており、Javaや.Netの使用は、スクリプト言語の使用とはまったく異なります(通常、スクリプトにはPerlを使用します)。固有の問題は、特に本番環境では、WSDLがそれほど頻繁に変更されるべきではないという事実にあります。Javaと.Netの考え方は、これらのスタブクラスを取得して、コンパイル時のエラーチェックを取得することです。

現在Ph1を使用していて、まだProdをデプロイしていない場合は、そのWSDLが変更される頻度を実際に調べる必要があります。次に、そこからどのテクノロジーを使用するかを決定します。良い点は、WSDLが変更された場合でも、インスタンスにデータを投稿することです。ほとんどすべてのフィールドはオプションです。したがって、新しいフィールドが追加されても大したことではありません。この問題は、データが返されるときに発生します(ほとんどの場合)。返されるXMLが期待する構造にない場合、javaと.netが例外をスローすることがよくあるためです。

多くの人が行うことの1つは、CMDBでモジュールをCIとしてセットアップし、変更要求モジュールを介してServiceNowインスタンスを維持することです。そうすれば、Javaアプリケーションはクエリを実行しているモジュール/テーブルのダウンストリームCIになり、CRを挿入してそのテーブルを変更すると、内部アプリケーションにも影響があることがすぐにわかります。

残念ながら、あなたは正しいですが、それは異なる言語とのトレードオフであり、私の経験から、それを変更するためにできることはほとんどありません。

追加するのを忘れたのは、代わりにJSONサービスを使用することです。これにより、SNCインスタンスに生のリクエストを送信し、JSONパーサーを使用して、いわば「オンザフライ」でそのデータを解析できるようになります。コンパイル時のチェックを取り除くだけでなく、SOAPシステムの多くの欠陥も取り除きます。

于 2012-12-20T08:23:07.150 に答える
1

Mavenを使用している場合は、このプラグインを使用してみてください。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>axistools-maven-plugin</artifactId>
    <version>1.4</version>
    <configuration>
        <urls>
                 <url>https://blah.com/incident.do?WSDL</url>
            </urls>
              <packageSpace>your.destination.package</packageSpace>
              <serverSide>true</serverSide>
              <outputDirectory>src/main/java</outputDirectory>
    </configuration>
    <executions>
         <execution>
            <goals><goal>wsdl2java</goal></goals>
         </execution>
    </executions>
</plugin>
于 2012-12-14T13:38:11.923 に答える
1

また、Eclipseを使用してJavaからServiceNowにアクセスしようとしましたが、ServiceNowがAPIを設計した方法を考えると、Axis2のアプローチは過度に制限されているように見えたので、JDOMを使用して動的にSOAP呼び出しを生成する独自のパッケージを作成しました。コードの例を次に示します。

Instance instance = new Instance("https://blah.service-now.com", "username", "password");
GlideFilter filter = new GlideFilter("category=network^active=true");        
GlideRecordIterator iter = instance.table("incident").
    bulkFetcher().setFilter(filter).getAllRecords().iterator();
while (iter.hasNext()) {
    GlideRecord rec = iter.next();
    System.out.println(
        rec.getField("number") + " " + rec.getField("short_description"));
}           

このコードに関するいくつかのこと:

  1. ビルド時の検証ではなく、実行時の検証を使用します。誤ってgetField( "shortdescription")と入力すると、コードはInvalidFieldNameExceptionをスローします。
  2. BulkFetcherは、すべてのデータを取得するために必要な数のWebサービス呼び出しを内部でループするため、クエリはServiceNowの通常の250レコード制限に拘束されません。

パッケージのソースコードはhttps://sourceforge.net/projects/servicenowpump/にあります。

于 2013-05-13T21:21:58.393 に答える
0

私が働いている会社では、PHPを使用して多くのSoapサービスを利用しています。常に、要求と応答のデータ構造のクラスを生成することをお勧めします。そうしないと、簡単に迷子になります。PHPは、元のXML構造の残りを保持せず、すべて配列とstdClassオブジェクトに変換されます。

PHPでは、WSDL記述から作成されたクラスを取得するのはそれほど簡単ではありません。これを実行するスクリプトはわずかしかないためです。また、SOAP標準のよりあいまいな部分を利用するWSDLファイルに関しては、すべてに欠点があります。その後、どういうわけか、これらのクラスをPHPスクリプトで使用できるようにする必要があります。これが難しい場合は、コードベースが適切に編成されていないことを示しています。自動読み込み機能を使用すると、魅力のように機能します。

しかし、はい、このステップはPHPでは完全にオプションです。Soapサービスを1つだけ使用する場合は、おそらく違いはありません。

于 2012-12-15T17:55:35.157 に答える