プログラマ38の日記

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

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はライブラリ側であえてエラー制御を実装しているということだと思います。