Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Salesforce連携のためのOData入門

8,423 views

Published on

2014/12/25 社内勉強会資料

Published in: Technology

Salesforce連携のためのOData入門

  1. 1. 2014年12月25日 株式会社FLECT 小西俊司
  2. 2.  Heroku Postgres上のデータをSalesforceの外部オ ブジェクトとして参照したいらしい  ODataの細かい仕様がどうなっているのかという点に は全く踏み込んでいない ◦ 所詮2,3日調べた程度なので多くを期待してはいけない
  3. 3.  Open Data Protocol ◦ http://www.odata.org/ ◦ Microsoft が主導で推進しているらしい  httpのREST APIだけでデータの参照・更新・削除を 行うための仕様  SQLのhttp版くらいに思っておけばOKだと思う ◦ ↑というか、まさに今この程度の理解 ◦ 具体的な検索条件やソートの指定の仕方等はなんとなく試し てみた程度でちゃんと調べてはいない
  4. 4.  httpだけでデータを読み書きできることにつきる  CORS(Cross Origin Resource Sharing)との組み 合わせを考えるとこんな状況もありえるかも? ◦ 近年色々な鉄道会社が時刻表や電車の遅延情報などをAPI で提供し始めている(気がする) ◦ しかし、それぞれの鉄道会社はAPIはRESTではあっても全部 独自形式(知らないけど多分) ◦ 各社のAPIはCORSには対応していないのでブラウザから直 接は叩けず、サーバで実行するしかない(に違いない) ◦ CORSとODataがサポートされればブラウザから直接各社の データに統一規格でアクセスできるのサーバ不要でアプリが 作れる(公開先はもはやGitHub.ioで良いですね(^^v)  まぁ希望なんで当分なさそうではあるけど
  5. 5.  V1からV4まであるらしい ◦ V4は近日正式リリース予定らしい  どこが変わったのかは知らないけど、多分できること が増えているのであろう  現在広く使われているバージョンはV2 ◦ かどうかは確信が無いが、とりあえずSalesforceの外部デー タ参照でサポートされているのはV2のみ ◦ V4も近い将来サポートされるらしい
  6. 6.  http://www.odata.org/libraries/  MS主導のため.NETのライブラリが一番充実している  Javaのライブラリで有力なのは以下の二つ ◦ Apache Olingo  V2 and V4  サーバ/クライアント両対応 ◦ odata4j  V1 – V3  サーバ/クライアント両対応  odata4jはコミットログを見る限り停滞しているように 見えるので、Olingoを使うのが良さげ
  7. 7.  一部クラスがServlet API依存なので、Play等の非 Servletから扱うのはしんどい ◦ やりかけたけど途中であきらめました。  ライブラリの完成度はやや怪しいかも。。。(-- ◦ 2,3日の評価なんで何とも言えないけど(後述) V4はまったく未検証
  8. 8.  https://github.com/shunjikonishi/odata- producer  Olingoで作成したOData Producer ◦ JPAのエンティティを作成することでテーブルをODataとして 公開出来る ◦ サンプルデータとして、Car, Makerという二つのテーブルと テストデータを生成する ◦ ベーシック認証対応
  9. 9.  サンプルはHeroku上で公開されているので以下の URLにアクセス ◦ BasicAuth: test/password ◦ http://flect-odata-test.herokuapp.com/odata ◦ http://flect-odata-test.herokuapp.com/odata/$metadata ◦ http://flect-odata-test.herokuapp.com/odata/Cars ◦ http://flect-odata-test.herokuapp.com/odata/Cars(1) ◦ http://flect-odata- test.herokuapp.com/odata/Cars?$filter=Car_name%20eq%2 0%27LEGACY%27
  10. 10.  設定 > 開発 > External Data Sources  設定項目 ◦ サーバURL: OData ProducerのURL (Ex. https://flect-odata-test.herokuapp.com/odata) ◦ 種別: OData 2.0 ◦ 形式: AtomPub ◦ Basic認証を設定した場合以下の認証設定が必要 ◦ ID種別: 指定ユーザ ◦ 認証プロトコル: パスワード認証 ◦ ユーザ名とパスワード
  11. 11.  設定 > 開発 > 外部オブジェクト ◦ 外部データソースを指定する以外は通常のカスタムオブジェ クトとあまり変わらない ◦ API参照名には「__x」が付加される ◦ 作成直後は外部IDと表示URLだけが項目として設定されて おり、各フィールドは手動でカスタム項目として追加する必要 がある  データ型等を指定できる  大文字小文字の差異に注意($metadataでフィールド名を確認 しながら設定を行うと良い) ◦ 他の外部オブジェクトや標準/カスタムオブジェクトに対して 参照関係が設定できる  多分、通常の参照/親子関係と同じ感覚で使用できると思う
  12. 12.  Car#maker_id -> Maker#maker_idの参照関係 を設定した例(デフォルトのまま)
  13. 13.  サブクエリ等も使えるがSOQLとして正しくてもエラー となるケースもあるらしい  成功するクエリの例 ◦ SELECT car_name__c, maker__r.maker_name__c FROM car__x WHERE maker__r.maker_name__c = 'HONDA’
  14. 14.  EXTERNAL_OBJECT_UNSUPPORTED_EXCEPTION ◦ LIKE検索で発生 ◦ ODataのfilterにLIKE構文はない  QUERY_TOO_COMPLICATED ◦ 参照テーブルにLIKE構文を使用したらエラーコードが変わっ た ◦ これもfilterの制限と思われる 原理的にODataでサポートしていない検索はできないはず
  15. 15.  http://flect-odata- test.herokuapp.com/odata/Cars?$filter=inde xof(Car_name, ‘WING’) eq 0 仕様にあるfilterのindexofとか実装されていない。 ただし、SalesforceからのOdata APIのキックでOlingo側の 未実装が問題となるケースには遭遇していない
  16. 16.  External Datasourceの設定画面にこんな項目がある  多分filterのカスタム関数を自前で作ればそれが使えるんだと 思う  この辺を参考にすれば実装できそう  http://olingo.apache.org/doc/odata2/tutorials/Olingo_T utorial_AdvancedRead_FilterVisitor.html  必要に迫られれば作る(PullRequest歓迎)
  17. 17.  https://github.com/shunjikonishi/odata- producer をフォーク  環境変数DATABASE_URLに接続先のPostgreSQLの URLを定義 ◦ 現在はPostgreSQL固定になっているので、MySQL等を使う場合 はHerokuEntityManagerFactoryとpersistense.xmlの修正が 必要  サンプルエンティティ(src/…/entities/*.java)を削除  公開したいエンティティをentities以下に定義  いじょ ◦ ローカルでの動作確認はrun.sh(run.bat)でできます。 ◦ Herokuで動かす場合は環境変数「APP_OPTS」でBASIC認証が 設定できます。
  18. 18.  JPAのエンティティとして定 義する ◦ Lombokが入っているので getter/setterは不要  余計な修飾は一切いらな い ◦ OneToManyとか ManyToOneとかは Salesforce側で解決される ので不要 ◦ 下手に付けるとOlingoがエ ラーで落ちることがある ◦ @Columnでフィールド名を 変更しても良いけど Salesforce側でも設定でき るのであまり意味はない
  19. 19.  紆余曲折あったが、結局のところ公式ドキュメント (http://olingo.apache.org/doc/odata2/index.htm l)のJPAの章ほぼそのままで動いた  ただしデフォルトでは例外発生時にStackTraceがでない のでそこだけは手を入れた方が良い ◦ MyODataJPAServiceFactory#getCallback参照 ◦ 当初OneToManyの定義が書き方によって動かなくて、原因を特 定するのにえらい苦労した  フックポイントは多いので多分何でもできるはず ◦ ODataの仕様書をちゃんと読めばね。。。。 ◦ ちょいちょいNot implementedを見かけるがそれも自力で解決で きると思われる  ちゃんと使おうと思ったら絶対ソースは読むべき(基本)
  20. 20.  とりあえずSalesforceから参照可能なODataProducerを 作るだけなら難しくはない ◦ 現状一番の問題はLIKEが使えないこと ◦ 認証がBASIC認証だけで良いかは課題  HerokuのOAuthを使っても良いけどあんまり意味が無い気がする ◦ パフォーマンス、実用性などは実案件に即した検証が必要  V4の今後がどうなるかは謎なので現状V2でどこまで作り 込むべきかは不明 ◦ 1年以内にV4が来るならV2での実装は不要と思う ◦ しかしOlingoのV4ドキュメントは現状ほとんどない。。。(--  OData自体はSalesforceと関係なくWatchする価値のあ る技術

×