プログラマ38の日記

主にプログラムメモです。

Java: axis1.4でSalesforce APIを使用する

まずはサンプルコード

    SoapBindingStub soapBinding = (SoapBindingStub)new SforceServiceLocator().getSoap();

soapBinding._setProperty(org.apache.axis.transport.http.HTTPConstants.MC_ACCEPT_GZIP , "true");
soapBinding._setProperty(org.apache.axis.transport.http.HTTPConstants.MC_GZIP_REQUEST , "true");

soapBinding._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "https://login.salesforce.com/services/Soap/u/39.0");

//httpプロキシを指定する
{
Properties systemprops = System.getProperties();
systemprops.setProperty("http.useProxy", "true");
systemprops.setProperty("http.proxyHost", "samplehost");
systemprops.setProperty("http.proxyPort", "9999");
systemprops.setProperty("http.proxyUser", "sampleproxyuser");
systemprops.setProperty("http.proxyPassword", "sampleproxypasword");
}


LoginResult loginResult = soapBinding.login("sampleuser@sample.username", "samplepassword");

String serverUrl = loginResult.getServerUrl();

soapBinding._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, serverUrl);

SessionHeader sh = new SessionHeader();
sh.setSessionId(loginResult.getSessionId());
soapBinding.setHeader((new SforceServiceLocator()).getServiceName().getNamespaceURI(), "SessionHeader", sh);

System.out.println(soapBinding.getServerTimestamp().getTimestamp());

コードの生成とライブラリの作成

axis1.4のライブラリとcommonshttp3.1のライブラリを手に入れます。

ダウンロードサイトが見つからない場合はこちらにアップロードしました。(いいのかなこれ、何か問題ありましたら教えてください。)

 

axis1.4のライブラリへクラスパスを指定し次のコマンドでコードをジェネレートします。

set classpath=..lib*
java -cp %classpath% org.apache.axis.wsdl.WSDL2Java -a partner.wsdl

出力されたファイルをコンパイルし、実行時にaxis1.4のライブラリと共にクラスパスに含めます。

httpproxyの設定

通信時にhttpproxyを使う場合は、次のようにシステムプロパティをセットします。システムプロパティなので、javaコマンドの引数からも指定可能です。

      Properties systemprops = System.getProperties();
systemprops.setProperty("http.useProxy", "true");
systemprops.setProperty("http.proxyHost", "samplehost");
systemprops.setProperty("http.proxyPort", "9999");
systemprops.setProperty("http.proxyUser", "sampleproxyuser");
systemprops.setProperty("http.proxyPassword", "sampleproxypasword");

エンドポイントの設定

本番やSandBoxのapiのエンドポイントを指定します。何も指定しないと、wsdlに記載のものを使います。

        soapBinding._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "https://login.salesforce.com/services/Soap/u/39.0");

インスタンスURLとセッションIDのセット

login後に、セッションIDとインスタンスURLが返却されます。インスタンスURLでエンドポイントを再設定し、セッションIDをSOAP Headerにセットします。

        String serverUrl = loginResult.getServerUrl();
soapBinding._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, serverUrl);

SessionHeader sh = new SessionHeader();
sh.setSessionId(loginResult.getSessionId());
soapBinding.setHeader((new SforceServiceLocator()).getServiceName().getNamespaceURI(), "SessionHeader", sh);

transportにhttpcommons3を使う

axis1.4の標準のtransportはaccept-Encodingでgzipに対応していないので、httpcommons3を使うように変更します。

client-config.wsddファイルに次の記載をします。

<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
</globalConfiguration>
<transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"/>
<transport name="https" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"/>
<transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/>
<transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/>
</deployment>

そして、実行時のjavaコマンドのシステムプロパティで、

-Daxis.ClientConfigFile=client-config.wsdd

を指定します。

 

以上を行うことで、上記コードのsoapBindingは、Salesforce APIとやりとりができる状態になります。