database.comへのアクセスの流れ
まずは、接続の際に最初の処理となる認証部分です。前回も説明しましたが、database.comへアクセスするにはOAuth認証を行います。処理の流れとしては、以下のようになります。
1.OAuth認証を行う
2.REST APIへアクセスする(以降は、これの繰り返し)
また、REST APIにアクセスする際には、OAuth認証時に連携される、
・インスタンスURL
・アクセストークン
という情報が必要になります。
インスタンスURLは、REST APIへアクセスする際に使用するURLです。またアクセストークンも、HTTPヘッダーに設定されて送信されることで、クライアントが認証を受けたことを判断します。
Javaテンプレートのソースから見た流れ
上記で記載したdatabase.comへのアクセス処理のフローを、前回使用したJavaテンプレートでは、どのように処理しているかを整理しましょう。まずは、ブラウザから「http://localhost:5000」と入力するところから開始します。
①web.xmlの定義により、localhost:5000に対するすべてのURLアクセスは、AuthFilterを実行するように定義されています。
②AuthFilterは、OAuth認証を行っていない場合は、ログインエンドポイントに設定されたURLへリダイレクトします。
③ブラウザにdatabase.comのログイン画面が表示されます。
④ログイン情報を入力し、ユーザー認証を行います。
⑤ユーザー認証がOKの場合は、コールバックURL(http://localhost:5000)へリダイレクトされます。
⑥上記の①の時と同じようにAuthFilterが実行されますが、OAuth認証がされている状態なので処理はスルーされ、home.jspが表示されます。
続いて、テンプレートアプリケーションのREST APIアクセスの流れは以下のようになっています。
①home.jsp内のボタンが押され、その情報が連携されてきます。AuthFilterはOAuth認証済みのため、処理はここでもスルーされます。
②Formのsubmit処理を行うRESTHelperがコールされます。このクラスでは、APIへコールする際のURLの組み立てやデータの設定を行い、要求の送信とレスポンスの受信を行います。
このクラスでは、APIへはデータを取得するケースではGET形式、データを更新するケースではPOST形式で送信し、そのためのURLを作成します。
String requestURL = httpClientFactory.getInstanceURL() + "/services/data/" + VERSION + "/query?" + URLEncodedUtils.format(qparams, "UTF-8"); String createURL = httpClientFactory.getInstanceURL() + "/services/data/" + VERSION + "/subjects/" + resource + "/";
URLの構成としては、
・インスタンスURL
・/services/data
・使用するAPIのバージョン
クエリーを記述する場合は、APIバージョンの後ろに、
・/query?
・SOQL文
データを更新する場合は、APIバージョンの後ろに、
・/subjects/
・リソース名
を記述することになります。
たとえば、
https://nal.salesforce.com/services/data/v24.0/query? Select t.Id From teacher__c t https://nal.salesforce.com/services/data/v24.0/sobjects/teacher__c/
という感じになります。
POST形式の場合には、以下のように画面から入力されたJSON形式のデータをセットします。
httppost.setEntity(new StringEntity(recordDescription, "application/json", null));
また、データ送受信の場合には、HTTPClientFactoryが保持しているセッション情報を使用して、データの送受信を行います。受信したらgetStatusCode()でステータスを確認し、エラーの有無をチェックしています。
HttpGet httpget = new HttpGet(requestURL); HttpResponse response = httpClientFactory.getHttpClient().execute( httpget); if (response.getStatusLine().getStatusCode() != 200) throw new Exception(EntityUtils.toString(response.getEntity()));
③RESTHelperからHTTP通信のために、HTTPClientFactoryがコールされます。
REST APIとの通信は、シンプルなHTTPクライアントからのアクセスになります。
httpClient = new DefaultHttpClient(); httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
またインスタンスURLの取得や、
SecurityContext sc = ForceSecurityContextHolder.get(); return sc.getEndPoint().substring(0, sc.getEndPoint().indexOf("/services"));
アクセストークンをヘッダー情報にセットするなどの処理を行います。
request.setHeader("Authorization", "OAuth " + sc.getSessionId());
どちらの情報もREST APIへアクセスする際には重要な情報で、ForceSecurityContextHolderから提供されます。
インスタンスURLは、以下のようになります。
SecurityContext sc = ForceSecurityContextHolder.get(); return sc.getEndPoint().substring(0, sc.getEndPoint().indexOf("/services"));
アクセストークンは、以下のようになります。
final SecurityContext sc = ForceSecurityContextHolder.get(); request.setHeader("Authorization", "OAuth " + sc.getSessionId());
④HTTPClientFactoryを通して、REST APIへ要求が送信されます。
⑤正常にレスポンスが受信されると、RESTHelperを通してdumpresponse.jspへ結果が表示されます。
以上が、前回利用したテンプレートアプリケーションのREST API処理の中身です。
***
Database.comは、