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