Comments
Description
Transcript
インテグレーションワーク ブック
インテグレーションワーク ブック インテグレーションワークブック, Summer ’16 @salesforcedocs 最終更新日: 2016/04/22 本書の英語版と翻訳版で相違がある場合は英語版を優先するものとします。 © Copyright 2000–2016 salesforce.com, inc. All rights reserved. Salesforce およびその他の名称や商標は、salesforce.com, inc. の登録商標です。本ドキュメントに記載されたその他の商標は、各社に所有権があります。 目次 Force.com インテグレーションワークブック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ご利用になる前に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 チュートリアル 1: Heroku アプリケーションの新規作成 . . . . . . . . . . . . . . . . . . . . . 5 ステップ 1: GitHub プロジェクトをコピーする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 ステップ 2: Heroku プロジェクトを作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 ステップ 3: アプリケーションをテストする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 チュートリアル 2: Warehouse アプリケーションと外部サービスの接続 . . . . . . . . 9 ステップ 1: 請求書で外部 ID 項目を作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 ステップ 2: リモートサイトレコードを作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 ステップ 3: インテグレーション Apex クラスを作成する . . . . . . . . . . . . . . . . . . . . . . . . 10 ステップ 4: @future メソッドをテストする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 ステップ 5: @future メソッドをコールするトリガを作成する . . . . . . . . . . . . . . . . . . . . . 13 ステップ 6: 完全なインテグレーションパスをテストする . . . . . . . . . . . . . . . . . . . . . . . 14 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 チュートリアル 3: Heroku アプリケーションの更新 . . . . . . . . . . . . . . . . . . . . . . . . 17 ステップ 1: 接続アプリケーションを設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 ステップ 2: 新しい分岐でアプリケーションを更新する . . . . . . . . . . . . . . . . . . . . . . . . . 17 ステップ 3: 請求書情報を表示する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 チュートリアル 4: Force.com Canvas を使用したアプリケーションの Salesforce への追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 ステップ 1: 新しい分岐でアプリケーションを更新する . . . . . . . . . . . . . . . . . . . . . . . . ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケー ションを有効にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ステップ 3: Force.com Canvas アプリケーションへのアクセスを設定する . . . . . . . . . . ステップ 4: Force.com Canvas アプリケーションを Chatter タブから使用できるようにす る .............................................................. ステップ 5: Visualforce を使用してレコードにキャンバスアプリケーションを表示す る .............................................................. まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . 20 . 25 . 25 . 26 . 28 Force.com インテグレーションワークブック Force.com 開発者が最も頻繁に行うタスクの 1 つに、Force.com アプリケーションと既存のアプリケーションのイ ンテグレーションがあります。このワークブックのチュートリアルでは、この機能の実現に必要な技術と概念 を紹介します。 Force.comインテグレーションワークブックは、Force.comワークブックと併用することを目的としています。こ のワークブックに含まれる一連のチュートリアルでは、Warehouse アプリケーションをクラウドベースの履行 アプリケーションに接続して、Warehouse アプリケーションを拡張します。 対象利用者 このワークブックは、Force.com プラットフォームを初めて使用し、Java に関する基本知識がある開発者を対象 としています。 もうひとこと... このワークブックは、手順をできるだけ早く進められるように構成されています。一部のステップの最後に、 補足情報を示す「もうひとこと...」セクションがあります。 1 Force.com インテグレーションワークブック • このワークブックおよび他のワークブックの最新バージョンは、 https://developer.salesforce.com/page/Force.com_workbook にあります。 • Force.com の詳細を学んだり、豊富なリソースセットにアクセスしたりするには、Salesforce Developers (https://developer.salesforce.com) にアクセスしてください。 2 ご利用になる前に チュートリアルをご利用になる前に、Warehouse データモデルを組織でインストールし、Heroku 開発者アカウ ントを作成し、ローカルワークステーションで Heroku Toolbelt ソフトウェアをインストールする必要がありま す。 ステップ 1: Warehouse データモデルをインストールする このワークブックでは、簡単な在庫管理システムを表す一連のオブジェクトを使用します。これらのオブジェ クトを開発者の組織にインストールする手順は、次のとおりです。 1. Developer Edition アカウントがない場合は、http://sforce.co/1ugNn2R でアカウントにサインアップします。 2. ブラウザで https://login.salesforce.com/packaging/installPackage.apexp?p0=04ti0000000Pi7P に移動します。 3. Developer Edition 組織のユーザ名とパスワードを使用してログインします。 4. [パッケージインストールの詳細] ページで、[次へ] をクリックします。 5. [次へ]をクリックします。[Security Level (セキュリティレベル)] ページで、[次へ]をクリックします。次のペー ジで、[インストール] をクリックします。 6. 一部のサンプルレコードも追加します。現在の Salesforce ページの右上隅にあるドロップダウンアプリケー ションメニューから Warehouse アプリケーションを選択します。 7. [Data (データ)] タブをクリックし、[Create Data (データを作成)] をクリックしてサンプルレコードを追加しま す。 メモ: このワークブックを完了したら、[設定] の [インストール済みパッケージ] に移動し、Warehouse パッ ケージを削除して、Warehouse データモデルとサンプルデータを組織からアンインストールできます。 ステップ 2: Heroku アカウントを作成する Heroku は、Force.com とは別のクラウドアプリケーションプラットフォームです。Heroku には、Java を含めた複 数の言語でアプリケーションをリリースするための強力なプラットフォームがサービスとして備えられていま す。また、Git などの業界標準のツールを使用してアプリケーションを簡単にリリースできます。Heroku アカウ ントをまだ作成していない場合は、次の手順で無料のアカウントを作成できます。 1. http://heroku.com に移動します。 2. [Sign Up (登録)] をクリックします。 3. メールアドレスを入力します。 4. 確認メールを受け取るまで数分待機し、メールに示される手順に従います。 3 ご利用になる前に ステップ 3: Heroku Toolbelt をインストールする Heroku Toolbelt は、Heroku の操作に必要な無料のソフトウェアツールです。Heroku Toolbelt をインストールする手 順は、次のとおりです。 1. https://toolbelt.heroku.com に移動します。 2. 開発プラットフォーム (Mac OS X、Windows、Debian/Ubuntu) を選択します。 3. ダウンロードボタンをクリックします。 4. ダウンロードが完了したら、ダウンロードしたインストールパッケージをローカルのワークステーション で実行し、手順に従ってインストールします。 4 チュートリアル 1: Heroku アプリケーションの新規作 成 Heroku は、Java を含む複数の言語でアプリケーションをリリースするための強力なサービスとしてのプラット フォーム (PaaS) を提供します。このチュートリアルでは、Java Spring MVC フレームワークを使用して Web アプリ ケーションを作成し、Warehouse アプリケーションからの注文履行要求の処理を擬似的に実行します。 この練習では、Java に習熟していることが役立ちますが、必須ではありません。チュートリアルではまず、ア プリケーションテンプレートを使用してアプリケーションを稼働させます。次に、手順を段階的に進めなが ら、Force.com プラットフォームにアプリケーションをセキュアに統合します。 ステップ 1: GitHub プロジェクトをコピーする git は、速さと使いやすさに重点を置いた分散ソース制御システムです。Heroku は、Git に直接統合され、変更 を Heroku リポジトリに転送することで、アプリケーションの継続的なリリースを可能にします。GitHub は、Git リポジトリの Web ベースのホスティングサービスです。 GitHub に保存された既存の Spring MVC ベースのアプリケーションを使用します。次に、変更を加えて Heroku ア カウントにリリースし、更新が Heroku のクラウドフレームワークを介してオンラインで使用できるかどうかを 確認します。 1. コマンドラインターミナルを開きます。Mac OS X ユーザの場合、これを行うには、Applications/Utilities の下にあるターミナルプログラムに移動します。PC ユーザの場合、これを行うには、[スタート] メニュー に移動して、[ファイル名を指定して実行] ダイアログに「cmd」と入力します。 2. コマンドラインターミナルが起動したら、アプリケーション例のダウンロード先となるディレクトリに移 動します。たとえば、ディレクトリが「development」の場合、「cd development」と入力します。 3. 次のコマンドを実行します。 git clone https://github.com/sbob-sfdc/spring-mvc-fulfillment-base git が既存のプロジェクトを新しいフォルダ spring-mvc-fulfillment-base にダウンロードします。 ステップ 2: Heroku プロジェクトを作成する プロジェクトをローカルにコピーできたので、Web からアクセスできる場所にリリースする必要があります。 このステップでは、アプリケーションを Heroku にリリースします。 1. コマンドラインターミナルで、ディレクトリを前のステップで作成した spring-mvc-fulfillment-base フォルダに変更します。 cd spring-mvc-fulfillment-base 5 チュートリアル 1: Heroku アプリケーションの新規作成 ステップ 2: Heroku プロジェクトを作成する 2. 次のコマンドを実行して Heroku にログインします (必要に応じて、Heroku ログイン情報を続けて入力しま す)。 heroku login Heroku では、コードをリリースするために SSH で Git が使用されます。このマシンで SSH をまだ使用してい ない場合は、Heroku ログイン情報を入力した後で公開鍵を作成する必要があります。Microsoft Windows で、 公開鍵を作成する前に Git ディレクトリをシステムパスに追加しなければならない場合があります。 3. 次のコマンドを実行して、Heroku に新しいアプリケーションを作成します。 heroku create Heroku によって、ローカル Git リポジトリと、ホスティングフレームワーク上の新しいリポジトリが作成さ れます。ここで、アプリケーションを転送し、ローカル Git リポジトリが認識できるようにそのリモートリ リースの定義を追加できます。これにより、Git を使ったソースコントロール、ローカル編集、および Heroku クラウドへのアプリケーションのリリースが容易になります。 Heroku でのすべてのアプリケーション名は一意である必要があります。そのため、Heroku で新しいアプリ ケーションが作成されると次のようなメッセージが表示されます。 Creating quiet-planet-3215... done 重要: 上記の出力では、新しいアプリケーション名が quiet-planet-3215 として表示されていま す。この生成された名前をコピーしてテキストファイルに貼り付けるか、メモしておきます。この ワークブック全体を通して、アプリケーション名は {appname} として参照されますが、これを実際 のアプリケーション名に置き換える必要があります。つまり、アプリケーション名が quiet-planet-3215 の場合、チュートリアルのステップで https://{appname}.herokuapp.com/_auth 形式の URL を入力するようにメッセージが表示された ら、https://quiet-planet-3215.herokuapp.com/_auth と入力します。 4. ローカルコードを Heroku にリリースするには、次のコマンドを実行します。 git push heroku master プロンプトが表示されたら、[はい] を選択して heroku.com の認証を確認します。リリースプロセスでは、 ファイルをコピーし、必要な依存関係を取り込み、コンパイルしてアプリケーションをリリースするため、 少し時間がかかります。 5. プロセスが完了したら、次のコマンドを実行して既存のアプリケーションをプレビューできます。 heroku open 単純にブラウザで https://{appname}.herokuapp.com を開くこともできます。 これでクラウドに新しい Heroku アプリケーションを追加できました。最初のページは次のようになります。 6 チュートリアル 1: Heroku アプリケーションの新規作成 ステップ 3: アプリケーションをテストする もうひとこと... ターミナルログで git push コマンドまでスクロールし、どのような変化が起こるか確かめてください。早 い段階で、Heroku は転送されている内容が Spring MVC アプリケーションであることを検出して、Maven をイン ストールし、アプリケーションをビルドして実行します。これらすべてをコマンド 1 つだけで実行します。 ステップ 3: アプリケーションをテストする このステップでは、アプリケーションの簡易テストを実行してその動作を確認する方法を説明します。 1. ブラウザタブまたはウィンドウで、https://{appname}.herokuapp.com に移動します。 2. [Ajax @Controller Example (Ajax @Controller の例)] をクリックします。 3. 別のブラウザタブまたはウィンドウで、Force.comインスタンスの Warehouse アプリケーションを開きます。 4. [Invoices (請求書)] をクリックし、既存の請求書を選択するか、必要に応じて新しい請求書を作成します。 5. ブラウザの URL バーで、請求書レコード ID を選択します。これは、URL の salesforce.com より後の部分 すべてです。a01E0000000diKc のようになります。ID をクリップボードにコピーします。 6. Heroku アプリケーションが表示されているブラウザウィンドウまたはタブに戻ります。 7. 請求書レコード ID を [Id] の下の項目に貼り付けます。 8. [Create (作成)] をクリックします。この請求書 ID で注文が作成されます。この注文は、Salesforce の注文レ コードとは異なります。 9. [OK] をクリックします。次のようなページが表示されます。 7 チュートリアル 1: Heroku アプリケーションの新規作成 まとめ まとめ Heroku は多言語対応設計であるため、Git などの業界標準のツールを使用してアプリケーションを簡単にリリー スできます。通常、チームは Eclipse のようなローカル開発環境を使用します。Heroku でも Eclipse とシームレス に統合するための Eclipse プラグインをリリースしています。コマンドラインで Heroku を操作したり、アプリ ケーションのログやパフォーマンスツールに直接アクセスすることもできます。 8 チュートリアル 2: Warehouse アプリケーションと外 部サービスの接続 Force.comには、外部システムと統合するための方法がいくつかあります。たとえば、アウトバウンドメッセー ジを送信するワークフロールールを、コードを作成せずに宣言できます。また、Apexコードを使用して、より 複雑なシナリオをプログラムで実装できます。 このチュートリアルでは、Web サービスコールアウトを作成し、Warehouse アプリケーションをチュートリア ル 1 でリリースした履行アプリケーションと統合する方法を学習します。この履行システムは Java で記述さ れ、Heroku でホストされますが、Web サービスインターフェースを使用する任意のアプリケーションを使用で きます。 次の図に、シナリオ例の要件を示します。請求書の状況がForce.comシステムで「完了」に変わると、Heroku で 実行されている注文履行サービスに JSON 形式のメッセージが送信されます。これにより、注文 ID が Force.com システムに返されます。注文 ID は、請求書に追加されます。 ステップ 1: 請求書で外部 ID 項目を作成する まず、請求書カスタムオブジェクトで、Heroku で実行されている Java アプリケーションから返される注文 ID を 保存できるカスタム項目を作成します。この項目は外部システムへのインデックスとなるため、外部 ID にす るのが適切です。 1. Salesforce 組織にログインします。 2. 請求書明細カスタムオブジェクトに移動するには、[設定] から [クイック検索] ボックスに「Invoice」と 入力し、[Invoice (請求書)] を選択します。 3. [カスタム項目 & リレーション] までスクロールダウンし、[新規] をクリックします。 4. 項目のデータ型で [テキスト] を選択し、[次へ] をクリックします。 5. 項目表示ラベルに「OrderId」と入力し、項目の長さに「6」と入力します。デフォルトの項目名「OrderId」 を承認します。 6. [外部 ID] チェックボックスをオンにして、[次へ] をクリックします。 7. [次へ] をクリックしてデフォルトを承認してから、[保存] をクリックします。 9 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 2: リモートサイトレコードを作成する ステップ 2: リモートサイトレコードを作成する Force.comプラットフォームは、非常に慎重なセキュリティ制御を実装します。Force.comでは、デフォルトで外 部サイトへのコールアウトは禁止されます。このステップでは、[リモートサイトの設定] ページで Heroku Java サイトを登録する方法を学習します。 1. [設定] から、[クイック検索] ボックスに「リモートサイトの設定」と入力し、[リモートサイトの設定] を選 択します。 2. [新規リモートサイト] をクリックします。 3. [リモートサイト名] 項目に、「FulfillmentWebService」(スペースなし) と入力します。 4. [リモートサイトの URL] 項目に、「https://{appname}.herokuapp.com」と入力します。 5. [保存] をクリックして、残りのデフォルト値を受け入れます。 これで、アプリケーション内の任意の Apex コードで、チュートリアル 1 でリリースした履行 Web サービスを コールできます。 もうひとこと... 試しにこのリモートサイトレコードを削除して、次のステップ 3 と 4 でコールアウトを作成し、テストしてみ ましょう。権限のないアプリケーションから URL をコールしようとすると、エラーメッセージが生成されるこ とがわかります。このステップに戻り、リモートサイトレコードを忘れずに再度追加してください。 ステップ 3: インテグレーション Apex クラスを作成する アプリケーションから外部 URL にアクセスできるようになったので、コールアウトを実装しましょう。Apexト リガでは、同期 Web サービスコールは許可されていません。この制限により、Force.com アプリケーション内 のレコードが長時間実行される Web サービスによってロックされたままになることが回避されます。 このチュートリアルのステップでは、@future アノテーションを使用する非同期メソッドで Apex クラスを作 成してから、必要に応じてメソッドをコールするトリガを作成するという、正しいアプローチの構築方法を学 習します。トリガが非同期メソッドをコールすると、Force.comはコールをキューに追加し、トリガを実行して からレコードのロックを解除します。非同期コールが最終的にキューの先頭に達すると、Force.comはコールを 実行し、Heroku で実行されている注文履行 Web サービスに請求書を転記します。 まず、新しい Apex クラスで、非同期メソッドのコードを追加します。 1. [設定] から、[クイック検索] ボックスに「Apex クラス」と入力し、[Apex クラス] を選択します。 2. [新規] をクリックし、次のコードを貼り付けます。 public class Integration { // The ExternalOrder class holds a string and integer // received from the external fulfillment system. public class ExternalOrder { public String id {get; set;} public Integer order_number {get; set;} 10 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 3: インテグレーション Apex クラスを作成する } // // // // // // // The postOrder method integrates the local Force.com invoicing system with a remote fulfillment system; specifically, by posting data about closed orders to the remote system. Functionally, the method 1) prepares JSON-formatted data to send to the remote service, 2) makes an HTTP call to send the prepared data to the remote service, and then 3) processes any JSON-formatted data returned by the remote service to update the local Invoices with the corresponding external IDs in the remote system. @future (callout=true) // indicates that this is an asynchronous call public static void postOrder(List<Id> invoiceIds) { // 1) see above // Create a JSON generator object JSONGenerator gen = JSON.createGenerator(true); // open the JSON generator gen.writeStartArray(); // interate through the list of invoices passed in to the call // writing each invoice ID to the array for (Id invoiceId : invoiceIds) { gen.writeStartObject(); gen.writeStringField('id', invoiceId); gen.writeEndObject(); } // close the JSON generator gen.writeEndArray(); // create a string from the JSON generator String jsonOrders = gen.getAsString(); // debugging call, which you can check in debug logs System.debug('jsonOrders: ' + jsonOrders); // 2) see above // create an HTTPrequest object HttpRequest req = new HttpRequest(); // set up the HTTP request with a method, endpoint, header, and body req.setMethod('POST'); // DON'T FORGET TO UPDATE THE FOLLOWING LINE WITH YOUR APP NAME req.setEndpoint('https://{appname}.herokuapp.com/order'); req.setHeader('Content-Type', 'application/json'); req.setBody(jsonOrders); // create a new HTTP object Http http = new Http(); // create a new HTTP response for receiving the remote response // then use it to send the configured HTTPrequest HTTPResponse res = http.send(req); // debugging call, which you can check in debug logs System.debug('Fulfillment service returned '+ res.getBody()); // 3) see above // Examine the status code from the HTTPResponse 11 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 4: @future メソッドをテストする // If status code != 200, write debugging information, done if (res.getStatusCode() != 200) { System.debug('Error from ' + req.getEndpoint() + ' : ' + res.getStatusCode() + ' ' + res.getStatus()); } // If status code = 200, update each Invoice // with the external ID returned by the fulfillment service. else { // Retrieve all of the Invoice records // originally passed into the method call to prep for update. List<Invoice__c> invoices = [SELECT Id FROM Invoice__c WHERE Id IN :invoiceIds]; // Create a list of external orders by deserializing the // JSON data returned by the fulfillment service. List<ExternalOrder> orders = (List<ExternalOrder>)JSON.deserialize(res.getBody(), List<ExternalOrder>.class); // Create a map of Invoice IDs from the retrieved // invoices list. Map<Id, Invoice__c> invoiceMap = new Map<Id, Invoice__c>(invoices); // Update the order numbers in the invoices for ( ExternalOrder order : orders ) { Invoice__c invoice = invoiceMap.get(order.id); invoice.OrderId__c = String.valueOf(order.order_number); } // Update all invoices in the database with a bulk update update invoices; } } } {appname} を Heroku アプリケーション名に置き換えることを忘れないでください。 3. [保存] をクリックします。 このコードは、リモートサービスに必要なデータを収集し、リモートサービス HTTP コールを行い、リモート サービスから返されたデータを処理して対応する外部 ID を持つローカルの請求書を更新します。詳細は、コー ドに埋め込まれたコメントを参照してください。 ステップ 4: @future メソッドをテストする @future メソッドをコールするトリガを作成する前に、メソッド自体を対話形式でテストして、リモートサ イトの設定が正しく行われているか確認することをお勧めします。開発者コンソールを使用して、メソッドを 対話形式でテストできます。 1. 開発者コンソールを開きます。 2. [デバッグ] > [Open Execute Anonymous Window (匿名実行ウィンドウを開く)] をクリックし、次のコードを入 力します。 // Get an Invoice__c for testing Invoice__c invoice = [SELECT ID FROM Invoice__c LIMIT 1]; 12 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 5: @future メソッドをコールするトリガを作成 する // Call the postOrder method to test the asynchronous call Integration.postOrder(new List<Id>{invoice.id}); この Apex コードのスニペットでは、1 つの請求書の ID を取得し、その ID を使用して @future メソッドを コールします。 3. [Open Log (ログを開く)] チェックボックスをオンにします。 4. [Execute (実行)] をクリックします。ページ下部のログに 2 つのエントリが表示されます。2 行目をダブルク リックします。この行の操作は [Future Handler (Future ハンドラ)]、状況は [Success (成功)] に なっています。 5. [Execution Log (実行ログ)] の下にある [Filter (検索条件)] チェックボックスをオンにし、検索条件のテキストと して「DEBUG」と入力します。実行ログの最後の行までスクロールダウンして、ダブルクリックします。 履行 Web サービスからの応答を含む、次のようなポップアップウィンドウが表示されます。 08:08:42:962 USER_DEBUG [58]|DEBUG|Fulfillment service returned [{"order_number":2,"id":"a01E0000009RpppIAC"}] これで、履行 Web サービスをコールできる @future メソッドが機能することを確認できました。これをトリ ガに関連付けましょう。 ステップ 5: @future メソッドをコールするトリガを作成する ステップ 3 で作成した Integration.postOrder メソッドをコールするトリガを請求書オブジェクトで作成 するには、次の手順を実行します。 1. 請求書カスタムオブジェクトに移動するには、[設定] から [クイック検索] ボックスに「Invoice」と入力 し、[Invoice (請求書)] を選択します。 2. [トリガ]までスクロールダウンし、[新規]をクリックして、トリガスケルトンの場所に次のコードを貼り付 けます。 trigger HandleOrderUpdate on Invoice__c (after update) { // Create a map of IDs to all of the *old* versions of records // updated by the call that fires the trigger. Map<ID, Invoice__c> oldMap = new Map<ID, Invoice__c>(Trigger.old); // Create an empty list of IDs 13 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 6: 完全なインテグレーションパスをテストす る List<Id> invoiceIds = new List<Id>(); // Iterate through all of the *new* versions of Invoice__c // records updated by the call that fires the trigger, adding // corresponding IDs to the invoiceIds list, but *only* when an // invoice's status changed from a non-"Closed" value to "Closed". for (Invoice__c invoice: Trigger.new) { if (invoice.status__c == 'Closed' && oldMap.get(invoice.Id).status__c != 'Closed'){ invoiceIds.add(invoice.Id); } } // If the list of IDs is not empty, call Integration.postOrder // supplying the list of IDs for fulfillment. if (invoiceIds.size() > 0) { Integration.postOrder(invoiceIds); } } 3. [保存] をクリックします。 コードのコメントは、処理内容について説明しています。特に、Force.comトリガでは単一行と一括更新の両方 を処理できる必要があることに注意してください。これは、トリガを起動するコールの種類が単一行や一括更 新など、さまざまであるためです。トリガにより、この更新で完了した請求書 ID のリストが作成され、@future メソッドを再度コールして ID のリストが渡されます。 ステップ 6: 完全なインテグレーションパスをテストする 作成したトリガを起動して、インテグレーションをテストします。 1. Warehouse アプリケーションを選択します。 2. [請求書] タブをクリックします。 3. 最近のいずれかの請求書をクリックすると、請求書に OrderId がないことがわかります。 4. [Status (状況)] がすでに [Closed (完了)] になっている場合は、[Closed (完了)] という単語をダブルクリックして [Open (進行中)] に変更し、[保存] をクリックします。 5. [Status (状況)] の値をダブルクリックして [Closed (完了)] に変更し、[保存] をクリックします。これで、非同 期コールアウトがトリガされます。 6. 数秒待機してから、ブラウザのページを更新します。 7. OrderId 項目に外部注文 ID が表示されます。 次の画面は、変更を加える前の [Invoice (請求書)] タブを示します。 14 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 ステップ 6: 完全なインテグレーションパスをテストす る 次の画面は、非同期コールから新しい注文 ID が返された後の [Invoice (請求書)] タブを示します。 15 チュートリアル 2: Warehouse アプリケーションと外部 サービスの接続 まとめ まとめ おめでとうございます。アプリケーションで、履行サービスに請求書が送信されるようになりました。Heroku でホストされる履行アプリケーションに請求書の詳細を転記する、非同期の Apex クラスが正常に作成されま した。外部アプリケーションは、Web サービスからアクセスできる限りどこに存在してもかまいません。ここ では、JSON および REST などのオープン標準を使用して、データ転送を行ったり、請求書のトリガを使用して 処理を実行したりします。 16 チュートリアル 3: Heroku アプリケーションの更新 これで、インテグレーションの 2 つの側面が作成されました。一方は Heroku で Java エンドポイントを実行し、 他方は Force.com 上で、適切な変更が加えられたときにエンドポイントとやり取りします。接続を設定できた ので、関連情報を取得して Heroku アプリケーションを更新し、それをユーザに対して表示します。 ステップ 1: 接続アプリケーションを設定する 次に進む前に、接続アプリケーションを設定できるようにSalesforce組織に戻りましょう。概要レベルでは、次 の操作を実行します。 • 組織で使用可能な接続アプリケーションにアプリケーションを追加します。 • OAuth を有効にします。外部アプリケーションは、データにアクセスする前にリモートで認証する必要があ ります。Force.com では、認証メカニズムとして OAuth 2.0 (以降は OAuth と呼ぶ) をサポートしています。 では、開始しましょう。 1. [設定] から、[クイック検索] ボックスに「アプリケーション」と入力し、[アプリケーション]を選択します。 2. [接続アプリケーション] セクションで、[新規] をクリックします。 3. [接続アプリケーション名] に、アプリケーション名を入力します。 4. プログラムからアプリケーションを参照するときに使用する [API 参照名] を入力します。API 参照名は、 デフォルトの空白を除いた名前になります。 5. [取引先責任者 メール] を指定します。 6. API ([OAuth 設定の有効化]) で、[OAuth 設定の有効化] を選択します。 7. [コールバック URL] に「https://{appname}.herokuapp.com/_auth」と入力します。 メモ: {appname} を実際の Heroku アプリケーション名で置き換えてください。 8. [選択した OAuth 範囲] 項目で、[フルアクセス (フル)] および [ユーザに代わっていつでも要求を実行 (refresh_token、offline_access)] を選択し、選択された OAuth 範囲にそれを追加します。 9. [保存] をクリックします。 ステップ 2: 新しい分岐でアプリケーションを更新する Force.com インスタンスで新しい Apex トリガの作成中に、他の開発者が元のプロジェクトに新しい機能を追加 し、GitHub 上の特定の分岐に配置しました。この分岐を使用して、新しい機能をテストできます。特に、Heroku アプリケーションから Salesforce レコードに直接アクセスする機能についてテストできます。「full」と呼ばれ るこの分岐は、コードベースに簡単に追加できます。 1. コマンドラインに戻り、現在の場所が spring-mvc-fulfillment-base フォルダであることを確認しま す。 17 チュートリアル 3: Heroku アプリケーションの更新 ステップ 3: 請求書情報を表示する 2. 次のコマンドを入力して「full」分岐をフェッチし、主分岐にマージします。これらの操作をすべて 1 つの 手順で行います。 git pull origin full a. 次に進む前に、組織に戻ります。 b. [設定] から、[クイック検索] ボックスに「アプリケーション」と入力し、[アプリケーション]を選択しま す。 c. [接続アプリケーション設定] セクションで、アプリケーション名をクリックします。 d. [コンシューマの秘密] の横にある、[クリックして公開] をクリックします。 e. 表示された数値をコピーするには、キーボードコントロールを使用します。 3. Heroku アプリケーションに対して、アクセスキーを設定する必要があります。次の項目を入力します。 heroku config:add OAUTH_CLIENT_KEY=PUBLICKEY OAUTH_CLIENT_SECRET=PRIVATEKEY PUBLICKEY を[コンシューマ鍵]で置き換えます。同様に、PRIVATEKEY を[コンシューマの秘密]で置き換 えます。コマンドラインで入力する前に、この操作をテキストエディタで行うと便利です。 4. 次のコマンドを実行して、ローカルの変更を Heroku に転送します。 git push heroku master 5. ブラウザのタブまたはウィンドウで https://{appname}.herokuapp.com に移動し、変更内容を確認し ます (必要に応じてブラウザを最新の情報に更新します)。 OAuth フローをアプリケーションに追加することによって、サードパーティのサーバでユーザのログイン情報 を処理しなくても、セッション情報を操作するためのユーザの権限を要求できます。この機能がプロジェクト に追加されると、履行アプリケーションで Force.com REST API を使用して、ユーザのインスタンスから情報に直 接アクセスできます。 もうひとこと... GitHub でこの分岐「により加えられるすべての変更を確認するには、 https://github.com/sbob-sfdc/spring-mvc-fulfillment-base/compare/master...full を参照し てください。これらの変更では Force.com REST API を使用して請求書レコードを操作しています。特に InvoiceServiceImpl.java に注目して、請求書の作成、クエリ、取得、削除がどのように行われるかを確 認してください。このチュートリアルでは、findOrder() メソッドのみを使用しています。他のメソッドは 参照用に含まれています。 ステップ 3: 請求書情報を表示する 前のステップでは、ローカルコードに分岐をマージして新しい機能を追加しました。これで、OAuth の使用方 法と、Force.comプラットフォームからデータにアクセスする方法をアプリケーションで把握できるようになり ました。今度は、履行アプリケーションで請求書項目を表示しましょう。 1. ブラウザで履行アプリケーションに移動し、ページを更新します。 2. 注文をクリックします。 18 チュートリアル 3: Heroku アプリケーションの更新 まとめ このコードにより、ID に対応する請求書レコードが取得されます。データベースには Force.com に存在しない 擬似 ID が含まれる可能性があるため、デフォルトデータを表示することによって対応する例外がアプリケー ションで処理されます。請求書をモデルに追加すると、ビューで使用できるようになります。これで、履行ア プリケーションをテストすると、レコード ID を使用して REST API 経由で情報が取得され、Force.com インスタン スに現在ある請求書情報が表示されるようになりました。注文詳細ページは、次のようになります。 もうひとこと... 注文を作成するためのForce.comからの Web サービスコールは、セキュリティ保護されません。コールのセキュ リティ保護についてはこのワークブックでは触れていませんが、簡単な対応策としてForce.comアプリケーショ ンと履行アプリケーション間で共有の秘密鍵を設定する方法があります。Force.comアプリケーションは秘密鍵 を使用して要求内にパラメータから HMAC 署名を作成し、履行アプリケーションはその署名を検証します。 まとめ おめでとうございます。これで、履行アプリケーションで Force.com REST API 経由で請求書情報を取得し、ユー ザに表示できるようになりました。OAuth を使用して認証するようにアプリケーションを Salesforce で設定し、 Heroku でホストされるアプリケーションに OAuth ログイン情報を追加しました。アプリケーションをさらに変 更して、請求書情報を自由に操作できます。 19 チュートリアル 4: Force.com Canvas を使用したアプ リケーションの Salesforce への追加 ここまでで、すでに多くの作業を行いました。もう 1 歩進めて、アプリケーションを Salesforce 内から直接ユー ザがアクセスできるようにしましょう。Force.com Canvas を使用すると、サードパーティアプリケーションを簡 単に Salesforce に統合できます。Force.com Canvas は、アプリケーションをキャンバスアプリケーションとして公 開するために使用できるツールと JavaScript API のセットです。これを活用することで、ユーザは任意の新しい アプリケーションまたは既存のアプリケーションを Salesforce の一部として使用できるようになります。 ステップ 1: 新しい分岐でアプリケーションを更新する これまでの過程で、コードベースに「full」と呼ばれる分岐を追加しました。ここでは、「canvas」という分岐 を追加します。 1. コマンドラインに戻り、現在の場所が spring-mvc-fulfillment-base フォルダであることを確認しま す。 2. 次のコマンドを入力して canvas 分岐をフェッチし、主分岐にマージします。これらの操作をすべて 1 つの 手順で行います。 git pull origin canvas 3. 次のコマンドを実行して、ローカルの変更を Heroku に転送します。 git push heroku master 4. ブラウザのタブまたはウィンドウで https://{appname}.herokuapp.com に移動し、変更内容を確認し ます (必要に応じてブラウザを最新の情報に更新します)。 もうひとこと... GitHub でこの分岐により加えられるすべての変更を確認するには、 https://github.com/sbob-sfdc/spring-mvc-fulfillment-base/compare/full...canvas を参照してください。 新しい分岐では、チュートリアル 3、ステップ 2 の Heroku が開始する OAuth ではなく、Force.com Canvas API から の署名付き要求を使用しています。また、Force.com REST API も使用して請求書レコードを操作しています。特 に CanvasUiController.java に注目して、どのように署名付き要求を取得、解析、および設定してアプリ ケーションで使用できるようにしているかを確認してください。また、order.jsp は、請求書ページレイア ウトにより使いやすい画面を表示するように変更されています。このチュートリアルでは、署名付き要求をア プリケーションの canvasui ページと注文ページで使用できるようにする設定のみを行いました。 ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケーションを有効にする 接続アプリケーションはすでに設定しました。ここでは、Force.com Canvas で接続アプリケーションを有効にし て、設定します。 20 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケーションを有効にする 1. [設定] から、[クイック検索] ボックスに「アプリケーション」と入力し、[アプリケーション]を選択します。 2. [接続アプリケーション設定] セクションで、アプリケーションを選択して [編集] をクリックします。 3. [キャンバスアプリケーション設定] セクションで、[Force.com Canvas] チェックボックスをオンにしま す。 4. [キャンバスアプリケーションの URL] 項目で、https://{appname}.herokuapp.com/canvasui と入力 します。 5. [アクセス方法] 項目で、[署名付き要求 (POST)] を選択します。 6. [場所] 項目で、Chatter タブと Visualforce ページを選択し、選択された場所にそれを追加します。 7. [保存] をクリックします。 CanvasUiController.java を見ると、次のように署名付き要求を取得して検証する Heroku があります。 チュートリアル 3、ステップ 2 で設定した OAUTH_CLIENT_SECRET Heroku キーが利用されています。 @Controller @RequestMapping(value="/canvasui") public class CanvasUIController { private static final String SIGNED_REQUEST = "signedRequestJson"; private CanvasContext cc = new CanvasContext(); @Autowired private OrderService orderService; @Autowired private InvoiceService invoiceService; private Validator validator; @Autowired public CanvasUIController(Validator validator) { this.validator = validator; } @RequestMapping(method= RequestMethod.POST) public String postSignedRequest(Model model, @RequestParam(value="signed_request")String signedRequest, HttpServletRequest request){ String srJson = SignedRequest.verifyAndDecodeAsJson (signedRequest, getConsumerSecret()); CanvasRequest cr = SignedRequest.verifyAndDecode(signedRequest, getConsumerSecret()); HttpSession session = request.getSession(true); model.addAttribute(SIGNED_REQUEST, srJson); cc = cr.getContext(); CanvasEnvironmentContext ce = cc.getEnvironmentContext(); Map<String, Object> params = ce.getParameters(); if (params.containsKey("orderId")) { invoiceService.setSignedRequest(cr); Integer orderId = Integer.parseInt(params.get("orderId").toString()); if(orderId != null) { Order order = orderService.findOrder(orderId); 21 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケーションを有効にする if (order == null) { throw new ResourceNotFoundException(orderId); } model.addAttribute("order", order); Invoice invoice; try { invoice = invoiceService.findInvoice(order.getId()); } catch (ApiException ae) { // No match invoice = new Invoice(); } model.addAttribute("invoice", invoice); return "order"; } } return getOrdersPage(model); } @RequestMapping(method=RequestMethod.GET) public String getOrdersPage(Model model) { model.addAttribute("order", new Order()); model.addAttribute("orders", orderService.listOrders()); return "orders"; } private static final String getConsumerSecret(){ String secret = System.getenv("OAUTH_CLIENT_SECRET"); if (null == secret){ throw new IllegalStateException("Client secret not found in environment. You must define the OAUTH_CLIENT_SECRET environment variable."); } return secret; } } 検証の後、署名付き要求は order.jsp に渡され、ブラウザからアクセスできるようになります。 <%@ <%@ <%@ <%@ page session="false" %> taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <head> <title>Order</title> <link rel="stylesheet" href="<c:url value="/resources/blueprint/screen.css" />" type="text/css" media="screen, projection"> <link rel="stylesheet" href="<c:url value="/resources/blueprint/print.css" />" type="text/css" media="print"> <!--[if lt IE 8]> <link rel="stylesheet" href="<c:url value="/resources/blueprint/ie.css" />" type="text/css" media="screen, projection"> 22 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケーションを有効にする <![endif]--> <script type="text/javascript" src="<c:url value="/resources/jquery-1.4.min.js" /> "> </script> <script type="text/javascript" src="<c:url value="/resources/json.min.js" /> "> </script> <script type="text/javascript" src="<c:url value="/resources/canvas-all.js" /> "> </script> <script> // Get the Signed Request from the CanvasUIController var sr = JSON.parse('${not empty signedRequestJson?signedRequestJson:"{}"}'); // Set handlers for the various buttons on the page Sfdc.canvas(function() { $('#finalizeButton').click(finalizeHandler); $('#deleteButton').click(deleteHandler); }); // This function will be called when the "Finalize" button is clicked. // This shows using the Canvas Cross Domain API to hit the REST API // for the invoice that the user is viewing. The call updates the // Status__c field to "Shipped". If successful, the page is refreshed, // and if there is an error it will alert the user. function finalizeHandler(){ var invoiceUri=sr.context.links.sobjectUrl + "Invoice__c/${order.id}"; var body = {"Status__c":"Shipped"}; Sfdc.canvas.client.ajax(invoiceUri,{ client : sr.client, method: 'PATCH', contentType: "application/json", data: JSON.stringify(body), success : function() { window.top.location.href = getRoot() + "/${order.id}"; }, error: function(){ alert("Error occurred updating local status."); } }); } // This function will be called when the "Delete Order" button is clicked. // It will delete the record from the Heroku database. function deleteHandler(){ $.deleteJSON("/order/${order.orderId}", function(data) { alert("Deleted order ${order.orderId}"); location.href = "/orderui"; }, function(data) { alert("Error deleting order ${order.orderId}"); }); return false; } // This function gets the instance the user is on for a page referesh 23 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 2: 接続アプリケーションの詳細を編集して Force.com Canvas でアプリケーションを有効にする function getRoot() { return sr.client.instanceUrl; } </script> </head> <body> <div id="bodyDiv" style="width:inherit;"> <div id="myPageBlockTable"> <h2 id="OrderTitle"> Order Number: <c:out value="${order.orderId}"/> </h2> <table id="myTable" width="100%"> <col width="20%"> <tr><td class="myCol">Invoice Id:</td><td class="valueCol"> <c:out value="${invoice.id}"/></td></tr> <tr><td class="myCol">Invoice Number:</td><td class="valueCol"> <c:out value="${invoice.number}"/></td></tr> <tr><td class="myCol">Status:</td><td class="valueCol" valign="center"> <c:out value="${invoice.status}"/> <!-- Display a green check if the order is Shipped, or a red x if not shipped --> <c:choose> <c:when test="${invoice.status == 'Shipped'}"> <img src="/resources/images/shipped.png" /> </c:when> <c:otherwise> <img src="/resources/images/pending.png" /> </c:otherwise> </c:choose> </td></tr> </table> <!-- Display the Back and Delete Order Button if viewed outside of salesforce (no signed request). --> <!-- Display the Finalize Button if viewed inside of salesforce and the Status is not Shipped. --> <c:choose> <c:when test="${empty signedRequestJson}"> <button onclick="location.href='/orderui'">Back</button> <button id="deleteButton">Delete Order</button> </c:when> <c:otherwise> <c:if test="${invoice.status ne 'Shipped'}"> <button id="finalizeButton">Finalize</button> </c:if> </c:otherwise> </c:choose> </div> </div> </body> </html> 24 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 3: Force.com Canvas アプリケーションへのア クセスを設定する ステップ 3: Force.com Canvas アプリケーションへのアクセスを 設定する このアプリケーションは、特定の利用者による使用を前提に設計されているため、ここではアクセスする必要 のあるユーザにのみアクセス権を付与しましょう。 1. Salesforce で、[設定] から [クイック検索] ボックスに 「接続アプリケーション」と入力し、接続アプリケー ションの管理のオプションを選択します。 2. アプリケーションをクリックしてから、[編集] をクリックします。 3. [許可されているユーザ] 項目で、[管理者が承認したユーザは事前承認済み]を選択します。表示されるポッ プアップメッセージで [OK] をクリックします。 4. [保存] をクリックします。 次に、プロファイルと権限セットを使用して、キャンバスアプリケーションを表示できるユーザを定義し ます。この例では、システム管理者プロファイルを持つユーザにアプリケーションへのアクセスを許可し ます。 5. [接続アプリケーションの詳細] ページの [プロファイル] 関連リストで、[プロファイルを管理する] をクリッ クします。 6. [システム管理者] プロファイルを選択し、[保存] をクリックします。 [システム管理者]プロファイルを持つすべてのユーザがアプリケーションを使用できるようになりました。 ステップ 4: Force.com Canvas アプリケーションを Chatter タブか ら使用できるようにする インストールされたキャンバスアプリケーションが表示される場所は、「ステップ 2: 接続アプリケーションの 詳細を編集して Force.com Canvas でアプリケーションを有効にする」 (ページ 20) で接続アプリケーションを作 成するときに [場所] 項目で選択した値によって決まります。アプリケーションは Chatter タブで使用できるよ うになっているので、このステップで行うことはありません。Salesforce 組織にログインし、Chatter タブを選択 すると、アプリケーションナビゲーションリストにキャンバスアプリケーションが表示されます。 メモ: Chatter タブに注文のリストを表示するとき、orders.jsp が署名付き要求 POST を処理するように設 定されていることを留意してください。ただし、このページからレコードをクリックすると、OAuth を使 用する orderui にリダイレクトされます。Heroku OAuth フローが無効な場合、個別の注文を表示すると エラーが表示される場合があります。 アプリケーションの名前をクリックします。次のように表示されます。 25 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 5: Visualforce を使用してレコードにキャンバス アプリケーションを表示する ステップ 5: Visualforce を使用してレコードにキャンバスアプリ ケーションを表示する ここまでの作業によってアプリケーションを使用できるようになったので、さらに Visualforce を使用して請求 書レコードにキャンバスアプリケーションから情報を表示してみましょう。 1. [設定] から [クイック検索] ボックスに「Visualforce ページ」と入力し、[Visualforce ページ] を選択しま す。 2. [新規] をクリックします。 3. [表示ラベル] で、「FulfillmentCanvas」と入力します。この表示ラベルを使用して、カスタムタブの 定義や、標準ボタンの上書きを行うときなどに、[設定] ツールでページを識別します。 4. [名前] で、デフォルト名「FulfillmentCanvas」を受け入れます。 5. 次のマークアップを Visualforce の [マークアップ] ボックスに追加し、{appname} を Heroku アプリケーショ ン名で置き換えてから、[保存] をクリックします。 <apex:page standardController="Invoice__c"> <apex:canvasApp developerName="{appname}" parameters="{'orderId':'{!Invoice__c.OrderId__c}'}" width="100%"/> </apex:page> apex:canvasApp コンポーネントの parameters タグが "{'orderId':'{!Invoice__c.OrderId__c}'}" に設定されています。このコードでは、ページの読み込み時に JSON オブジェクトを署名付き要求の一部と して Heroku アプリケーションに送信します。署名付き要求では、parameters オブジェクトは parameters : {'orderId':'5'} のようになっています。ここで「5」は、請求書レコードの OrderId です。この値は、 Heroku データベースのレコードを Salesforce 請求書レコードに結び付ける外部 ID 項目です。署名付き要求で OrderId を Heroku アプリケーションに提供することで、Heroku アプリケーションは正しいレコードを請求書 ページレイアウトに表示できます。 26 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 ステップ 5: Visualforce を使用してレコードにキャンバス アプリケーションを表示する ページは次のようになります。 次に、Visualforce ページをページレイアウトに追加しましょう。 6. [Invoice (請求書)] タブからレコードを選択します。 7. [レイアウトを編集する] をクリックし、[Visualforce ページ] をクリックします。 8. セクションをページにドラッグし、「Canvas Fulfillment」と名前を付けます。 a. [編集ページ] をオフにします。 b. レイアウトの [1–Column] を選択します。 9. FulfillmentCanvas ページを新しいセクションにドラッグします。 10. レンチをクリックして、ページプロパティを更新します。幅は 100%、高さは 165 ピクセルに設定する必要 があります。 11. [スクロールバーを表示] と [ラベルを表示] の両方がオフになっていることを確認し、[保存] をクリックし ます。 12. [設定] から [クイック検索] ボックスに「オブジェクト」と入力し、[オブジェクト] を選択して、[Invoice (請求書)] をクリックします。 13. [カスタム項目 & リレーション] セクションで、[状況] をクリックします。 14. 「Shipped」(出荷済み) という名前でもう 1 つの選択リスト項目を追加します。 これで、ユーザが請求書レコードにアクセスすると、レコード詳細ページに直接キャンバスアプリケーション が表示されます。 27 チュートリアル 4: Force.com Canvas を使用したアプリ ケーションの Salesforce への追加 まとめ キャンバスアプリケーションに [Finalize (最終決定)] ボタンがあります。請求書が [Shipped (出荷済み)] 状況では ない場合、赤い [X] と [Finalize (最終決定)] がアプリケーションに表示されます。[Finalize (最終決定)] をクリック すると、Heroku は Force.com Canvas API を使用して REST API をコールし、請求書状況項目を更新します。状況が [Shipped (出荷済み)] に設定されると、赤い [X] が置き換えられ、[Finalize (最終決定)] は非表示になります。 まとめ 以上でこのステップは完了です。OAuth 認証、Force.com REST API、Apex トリガ、@future コールアウト、Heroku プラットフォームの多言語フレームワーク、Force.com Canvas、および Visualforce を組み合わせて、2 つのクラウ ド間で双方向のインテグレーションを作成し、リリースしました。 このワークブックは、アプリケーションをSalesforceに統合する多くの方法のうちの一例を紹介しているにすぎ ません。説明していないインテグレーション技術の 1 つとして、ユーザが Salesforce データを変更するたびにア プリケーションで Force.com から通知を取得できるストリーミング API があります。これを履行アプリケーショ ンで使用すると、請求書に変更が加えられるタイミングを監視し、それに基づいてアプリケーションページを 自動的に更新できます。https://developer.salesforce.com にアクセスして、アプリケーションをSalesforce に統合できるすべての方法についての詳細を参照してください。 28