LoginSignup
7
7

More than 5 years have passed since last update.

Partner.WSDL を用いた SalesForceのSOAP連携

Posted at

開発ライセンスのSalesForceを登録

ここで登録可能
https://developer.salesforce.com/signup

今回はセキュリティートークンで認証するため
「私の設定」⇒「私のセキュリティートークンのリセット」
リセットすると、トークンが登録アドレスに送られてくる。

image

Partner WSDLの取得

自社に連携ツールを作るなら本来は Enterprise WSDL の方が良い。
但し、今回はより汎用的に利用できる Partner WSDL を取得する。

image

http://mvnrepository.com/artifact/com.force.api/force-wsc/34.0
ここから force-wsc-34.0.jar をダウンロードして

$ java -classpath force-wsc-34.0.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/stringtemplate/v4/STGroupDir

失敗するが単なるライブラリ不足。
http://www.stringtemplate.org/download/ST-4.0.8.jar
これを落として再度トライ。

$ java -classpath force-wsc-34.0.jar;ST-4.0.8.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

今回はMavenProjectを利用するので

$ mvn install:install-file -Dfile=D:\foo\lib\partner.jar -DgroupId=co.jp.infomart.force -DartifactId=partner -Dversion=34.0 -Dpackaging=jar -DgeneratePom=true

で、生成したpartner.jarをローカルリポジトリに入れておく。

ログインを実装して繋ぐ

まずは、必要なライブラリ。
だいたい、こんなもんだというところで・・・

pom.xml
        <dependency>
                <groupId>com.force.api</groupId>
                <artifactId>force-wsc</artifactId>
                <version>34.2.2</version>
        </dependency>
        <dependency>
                <groupId>com.force.api</groupId>
                <artifactId>force-partner-api</artifactId>
                <version>34.0.0</version>
        </dependency>
        <dependency>
            <groupId>co.jp.infomart.force</groupId>
            <artifactId>partner</artifactId>
            <version>34.0.0</version>
        </dependency>

で、実装はこちら

接続テスト
/**
 * 接続テスト
 * 接続して、取引先の基本情報を取得
 */
private static void connectTestOne() {

    final String uid = "ログインID(メールアドレス)を設定";
    final String pass = "パスワードと発行したセキュリティートークンを繋げて設定";
    // ↑ パスワードが「pass」でトークンが「xyz」なら「passxyz」となる

    /**
     * 接続設定
     */
    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(uid);
    config.setPassword(pass);
    config.setAuthEndpoint("https://login.salesforce.com/services/Soap/u/34.0");

    PartnerConnection connection = null;
    boolean isConnected = false;
    try {

        // 接続
        connection = com.sforce.soap.partner.Connector.newConnection(config);
        isConnected = true;
        LoginResult lr =connection.login(uid, pass);

        System.out.println("--------------------------------");
        System.out.println(lr.getUserInfo().getOrganizationName());
        System.out.println(lr.getUserInfo().getUserFullName());
        System.out.println("login success...");
        System.out.println("--------------------------------");

    } catch (ConnectionException ex) {
        Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);

    } finally {

        // 切断
        try {
            if( isConnected ) {
                connection.logout();
                System.out.println("--------------------------------");
                System.out.println("logout success...");
                System.out.println("--------------------------------");
            }
        } catch (ConnectionException ex) {
            Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

取引先を取得して表示

https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_account.htm
これがかなり参考になる。

取引先を取得する
/**
 * 取引先一覧情報を取得
 * @param partnerConnection 
 */
public static void querySample(PartnerConnection partnerConnection) {   
    try {
        // バッチサイズを設定
        partnerConnection.setQueryOptions(250);

        // 取引先抽出のSOQLを指定して抽出
        String soqlQuery = "SELECT AccountNumber, Name, Phone, Fax, (Select c.Name From Contacts c) contactName FROM Account WHERE IsDeleted = false";
        QueryResult qr = partnerConnection.query(soqlQuery);

        boolean done = false;
        int loopCount = 0;

        // 結果を取得して表示
        while (!done) {
            System.out.println("Records in results set " + loopCount++ + " - ");
            SObject[] records = qr.getRecords();

            for (int i = 0; i < records.length; i++) {
                SObject account = records[i];
                Object accountName = account.getField("Name");
                Object accountPhone = account.getField("Phone");
                Object accountFax = account.getField("Fax");

                System.out.println("Account " + (i+1) + ": " 
                        + account.getField("AccountNumber") + ":" + (accountName != null ? accountName : "")
                        + " Phone " + (accountPhone != null ? accountPhone : "") 
                        + " Fax "   + (accountName  != null ? accountFax   : ""));

            }
            if (qr.isDone()) {
                done = true;
            } else {
                qr = partnerConnection.queryMore(qr.getQueryLocator());
            }
        }
    } catch(ConnectionException ce) {
        ce.printStackTrace();
    }
    System.out.println("\nQuery execution completed.");
}

で、こんな感じで取得ができる。
サンプルデータだけど。

出力結果
--------------------------------
株式会社むむむ
とっとこ ハム太郎
login success...
--------------------------------
Records in results set 0 - 
Account 1: CC978213:GenePoint Phone (650) 867-3450 Fax (650) 867-9895
Account 2: CD355119-A:United Oil & Gas, UK Phone +44 191 4956203 Fax +44 191 4956620
Account 3: CD355120-B:United Oil & Gas, Singapore Phone (650) 450-8810 Fax (650) 450-8820
Account 4: CD451796:Edge Communications Phone (512) 757-6000 Fax (512) 757-9000
Account 5: CD656092:Burlington Textiles Corp of America Phone (336) 222-7000 Fax (336) 222-8000
Account 6: CC213425:Pyramid Construction Inc. Phone (014) 427-4427 Fax (014) 427-4428
Account 7: CC634267:Dickenson plc Phone (785) 241-6200 Fax (785) 241-6201
Account 8: CD439877:Grand Hotels & Resorts Ltd Phone (312) 596-1000 Fax (312) 596-1500
Account 9: CC947211:Express Logistics and Transport Phone (503) 421-7800 Fax (503) 421-7801
Account 10: CD736025:University of Arizona Phone (520) 773-9050 Fax (520) 773-9060
Account 11: CD355118:United Oil & Gas Corp. Phone (212) 842-5500 Fax (212) 842-5501
Account 12: null:sForce Phone (415) 901-7000 Fax (415) 901-7002

Query execution completed.
--------------------------------
logout success...
--------------------------------
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7