For Want Of A Better Word

【SalesForce】Toolkitでsoql_select、 Apexクラス作成(SOQL_SOAP、Apexクラス_REST)

      2016/06/07

salesforceをいじる機会があったので、ToolkitのSOQL発行と、APEXクラスの作成方法メモ。

 

①Toolkitを利用して、soqlクエリーを発行する。

開発メモ

APIはいろいろあるようだが、簡単なAccount周りの情報がとれればよいだけなら、SOQL(salesforce用sql)をAPIに投げることでデータ取得できる模様。

phpで、先に yum install php-soapでsoapを入れておく。じゃないと「 Class ‘SoapClient’ not found」というエラーが出る。

事前作業
  • php、php-xml、php-soapのインストール(他にもあるかも..)
  • salesforce側でアクセス許可IP設定
  • php用のツールキットのダウンロードと配置
    ・ https://developer.salesforce.com/page/PHP_Toolkit

サンプルコードを実行する。

(備忘)発生したエラー(上記コードは対応済み)
  • ①「Class ‘SoapClient’ not found」
    ⇒ php-soapをインストール
  • ②「Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘enterprise.wsdl.xml’ : failed to load external entity “enterprise.wsdl.xml” …..  ⇒「$mySforceConnection->createConnection(“enterprise.wsdl.xml”)」のxml指定をフルパスで書く。
  • ③「Uncaught SoapFault exception: [sf:LOGIN_DURING_RESTRICTED_DOMAIN] LOGIN_DURING_RESTRICTED_DOMAIN:」 ⇒ salesforce側でのアクセス許可IPの問題。

クエリーを発行してみる。

 

 

ぶわっと取れる。結果は連想配列。

2000件以上取得する

1回のクエリーの戻り件数は2000件で切られる。続きを取得するには以下のようにする。

 

※注意:日付型項目(created_datetime)が取れない

これはそのまま。型の問題だと思うけど、少なくともPHPでは取れず、サンプルを眺めてもdatetimeを取得しているものは無かった。(逆に設定しているようなものはあったけど。)

ここはあきらめてApexクラスで実装することにする。

※親・子要素も取得したい時…

countや LIKE INも使える模様。。。しかしjoinができない。

ワイルドカードも使えない。。。。

問題は「オブジェクト」と「親子」関係。

標準オブジェクトとカスタムオブジェクト、オブジェクト名と参照名、オブジェクト内の項目の、参照が親⇒子か子⇒親かといった要素で、クエリーの書き方が異なるらしい。

※開発者コンソール(システム開発権限があるユーザーで、salesforce画面のログイン後、自分の名前をクリックすると、リンクがある。)で実行するSOQLはうまくデータが取れるのに、API経由ではどうも、という場合もあった。。

はっきりクリアはできなかったが、下記のクエリで、Accountから参照している項目を含めて値が取得できた。

①Accountのidと照している子オブジェクトのidを取得(参照名例:Address)

__rを参照名の後ろにつけるのがポイント

②上記の際に、子オブジェクトは複数存在しえるので、子オブジェクトに条件をつける。

 

③【注意】親⇒子は1段階しか問い合わせできず、子オブジェクトからさらに下は問い合わせできない。下記はエラーとなる。

 

もろもろ制約あるので、SOQLでぱっとできないことは、後述のApexクラスで対応するのが無難。。

….SOQLはここまで。

 

SOQL API 参考リンク

 

②soqlでは足りないので、APEXクラスを作成してREST APIとする場合

開発メモ

私のSOQL スキルでは、階層化しているカスタムオブジェクトからデータがうまくとれなかったので、Apexクラスを作成して、RESTAPIとするーことに。

REST API作成の流れは

  • ①salesforce側でリモート接続の作成
  • ②Apexクラスの作成(doGet or doPostの実装)
  • ③テストクラスでカバレッジ75%を実現
  • ④本番へリリース(リリース設定)

という感じで、道のりは長い。※③④はまだ。

GETとPOSTどっちでもできるけど、今回は引数を大量に送りたいので、POSTで実現する。

①salesforce側でリモート接続の作成

・リモートアクセスアプリケーションの作成

★リモートアクセスアプリケーションの作成は、設定>開発>接続アプリケーションに移動。任意にぼろぼろ。アクセス許可IPも。で作成後、秘密鍵、クライアントIDが取得できるので、これをメモ。

・コードを書いてテスト接続(サーバー側)

oauth.phpを使わせてもらう…

http://www.nkjmkzk.net/?p=2328

  • WEB上で都度認証してもらうなら、「auth_with_code()」で認証
  • ★システムで固定ユーザーを持つなら、「auth_with_password()」で認証する。
    さらにauth_with_password()を実施する場合は、「new oauth()」の時に第五引数でキャッシュディレクトリを設定し、書き込み権限を設定しておく必要がある。
  • ※※casheフォルダの中身に要注意。※※
    認証ユーザーを変えたり、変えなかったりしていると、キャッシュと不整合がおきて、よくわからん挙動になるぜ。
    認証設定を変えたりして、やり直したいときはcacheフォルダの中身を空にしよう。
【補足】curlでのポスト

サーバー側で接続後リクエストをPOSTする時は以下のようなコードになる。

 

②Apexクラスの作成(doGet or doPostの実装)

開発環境から新規にApexクラスを作成し、ぶんぶん作っていく。

 

※※重要※※

後半にも書いているけど

saleforceのGUIからテストを実行しても、クエリーでどうもレコードが取得できず、カバレッジが上がらずリリースできない。(テストコードは大丈夫なはずなのに。)

これが、Eclipseのsalesforce IDEからApexクラス、テストクラスを作成して、save to serverをすると、問題なくいける。。。なぞだけど….

なので、Eclipseのセールスフォースプラグインででセールスフォースに繋いで、そこから新規クラスを作ることになる。

参考:http://www.terrasky.co.jp/blog/2013/131002_001309.php

 

 

開発

※APIのURLは、先頭で明記した「url_mapping」の値をsalesforceログイン後のurlの後ろに足せばOK。

補足

※urlについて

APIのURLは、先頭で明記した「url_mapping」の値をsalesforceログイン後のurlの後ろに足せばOK。

※パラメータについて

postされたデータは以下の方法で取得できる。

 

※ログについて

doGet(), doPost()をAPIで実行しても、なんかデバッグログが取れん。ログを見たいなら、テストコードを作成して、開発者コンソールから見るとlogが出力される。ログ出力コマンドは「system.debug(‘xxsxxxxx’)」。

 

 

テストクラスの作成(doPost)

リリースには必要ということで、デバッグにも使えるし。

 

 

※privateメソッドは直接コードがかけない…..

※カバレッジの確認方法

開発者コンソールからテストを実行して、下のテストタブの右下に出るクラスをクリックすると、どこをカバーしたのかソースを見ながら確認できる。

 

③④のUnitテストカバレッジとリリースについて

 

しかし、saleforceのGUIからテストを実行しても、クエリーでどうもレコードが取得できず、カバレッジが上がらずリリースできない。(テストコードは大丈夫なはずなのに。)

これが、Eclipseのsalesforce IDEからApexクラス、テストクラスを作成して、save to serverをすると、問題なくいける。。。なぞだけど….

 

こんな感じでひとまず機能リリースOK。

参考リンク

新しくなったForce.com OAuth Toolkit for phpの使い方 at nkjmkzk.net
JP:Getting Started with the Force.com REST API – developer.force.com
Apex Quick Start | Force.com Apex Code Developer’s Guide | Salesforce Developers

How to write a test class for an apex class with do post method – Salesforce Stack Exchange
[apex][SF]ApexRESTのテストコードでのパラメータの渡し方 – KayaMemo

 - salesforce

  関連記事

関連記事はありませんでした