Salesforce連携のためのOData入門

  • 275 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
275
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
1
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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