crmprogrammer38の日記

主にDWHやSalesforceのプログラムメモです。

【Java】wscでSalesforce APIを使用する

まずはサンプルコード

    ConnectorConfig connectorConfig = new ConnectorConfig();
    String soapEndpoint = "https://login.salesforce.com/services/Soap/u/39.0";
    connectorConfig.setAuthEndpoint(soapEndpoint);
    connectorConfig.setManualLogin(true);
    connectorConfig.setCompression(true);
    connectorConfig.setConnectionTimeout(120000);

    //httpプロキシを指定する
    {
      connectorConfig.setProxy("samplehost", 9999);
      ProxyUserPasswordConfig.setProxyUserPassword("sampleproxyuser", "sampleproxypasword");
    }

    PartnerConnection soapBinding = Connector.newConnection(connectorConfig);
    LoginResult lr = soapBinding.login("sampleuser@sample.username",  "samplepassword");
    soapBinding.setSessionHeader(lr.getSessionId());
    connectorConfig.setServiceEndpoint(lr.getServerUrl());
    
    System.out.println(soapBinding.getServerTimestamp().getTimestamp());

httpproxyのユーザ、パスワードは「PasswordAuthentication」を使うため上記で次のクラスを使っています。(wsimportの時と同様です)

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class ProxyUserPasswordConfig extends Authenticator {
  
  private String user;
  private String password;
  
  private ProxyUserPasswordConfig(String proxyuser,  String proxypassword){
    user = proxyuser;
    password = proxypassword;
  }

  public static void setProxyUserPassword(String proxyuser, String proxypassword){    
    Authenticator.setDefault(new ProxyUserPasswordConfig(proxyuser,proxypassword));
  }
    protected PasswordAuthentication getPasswordAuthentication() {  
        return new PasswordAuthentication(user, password.toCharArray()); 
    }  
}

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

wscのライブラリをclasspathに指定し次のコマンドを使います。jarまで自動で作成してくれます。jarにはソースコードも含まれます。

java -DcompileTarget=1.8  -classpath ..\lib\* com.sforce.ws.tools.wsdlc partner.wsdl partner.jar
java -DcompileTarget=1.8  -classpath ..\lib\* com.sforce.ws.tools.wsdlc metadata.wsdl metadata.jar

httpproxyの設定

コード内で指定となっています。

      connectorConfig.setProxy("samplehost", 9999);
      ProxyUserPasswordConfig.setProxyUserPassword("sampleproxyuser", "sampleproxypasword");

エンドポイントの設定

ConnectorConfigで指定となります。

    ConnectorConfig connectorConfig = new ConnectorConfig();
    String soapEndpoint = "https://login.salesforce.com/services/Soap/u/39.0";
    connectorConfig.setAuthEndpoint(soapEndpoint);

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

ここも、エンドポイントと同様に、ConnectorConfigで指定します。

    soapBinding.setSessionHeader(lr.getSessionId());
    connectorConfig.setServiceEndpoint(lr.getServerUrl());

これで上記コードのsoapBindingでSOAP APIを使用できます。

Salesforce専用ライブラリであり、他のライブラリに比べとても簡潔なコードになります。

また、スレッドセーフな設計です。(他のライブラリは1つのスタブインスタンスを複数スレッドで使うことができません)

 

ただし、注意事項として、insert/update/upsertで、ライブラリ側で項目にセットした値の型をチェックします。

他のライブラリは項目にセットするのは文字型であり、

  • 日付型はyyyy-MM-ddの形式
  • 日付/時間型はyyyy-MM-dd'Y'HH:mm:ss.000Z形式
  • チェックボックス型はtrue/false
  • バイナリ型はbase64エンコードされた文字列
  • 数値型は、数値として扱える文字列(指数表現もok)

なのに対して、wscは

  • 日付型はDate
  • 日付/時間型はCalendar
  • チェックボックス型はBoolean
  • バイナリ型はbyte[]
  • int型は、Integer (なぜか他の数値項目は、数値として扱える文字列でok)

の制限があります。

 

他のライブラリでは、上記型の値が不正だった場合、APIコール時に原因追求が困難なエラーがでます。が、wscはライブラリ側であえてエラー制御を実装しているということだと思います。