プログラマ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とやりとりができる状態になります。