EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

005 Javaからdatabase.comへアクセスする、その中身を具体的に見てみよう

edited by DB Online   2013/03/15 00:00

前回、サンプルのテンプレートを使用して、Javaからdatabase.comへアクセスする方法について紹介しました。今回は、database.comへのアクセス方法について、もうすこしその中身がどうなっているのかを整理していきたいと思います。ここではJavaを前提に説明しますが、基本的には他の言語でも同じことが言えるはずです。

 

database.comへのアクセスの流れ

 まずは、接続の際に最初の処理となる認証部分です。前回も説明しましたが、database.comへアクセスするにはOAuth認証を行います。処理の流れとしては、以下のようになります。

 1.OAuth認証を行う

 2.REST APIへアクセスする(以降は、これの繰り返し)

 また、REST APIにアクセスする際には、OAuth認証時に連携される、

 ・インスタンスURL
 ・アクセストークン

 という情報が必要になります。

 インスタンスURLは、REST APIへアクセスする際に使用するURLです。またアクセストークンも、HTTPヘッダーに設定されて送信されることで、クライアントが認証を受けたことを判断します。

database.comへの接続の流れ
 database.comへの接続の流れ

Javaテンプレートのソースから見た流れ

 上記で記載したdatabase.comへのアクセス処理のフローを、前回使用したJavaテンプレートでは、どのように処理しているかを整理しましょう。まずは、ブラウザから「http://localhost:5000」と入力するところから開始します。

テンプレートアプリケーションのOAuth認証の流れ
 テンプレートアプリケーションのOAuth認証の流れ

 ①web.xmlの定義により、localhost:5000に対するすべてのURLアクセスは、AuthFilterを実行するように定義されています。

フィルタの定義(web.xml)
 フィルタの定義(web.xml)

 ②AuthFilterは、OAuth認証を行っていない場合は、ログインエンドポイントに設定されたURLへリダイレクトします。
 ③ブラウザにdatabase.comのログイン画面が表示されます。
 ④ログイン情報を入力し、ユーザー認証を行います。
 ⑤ユーザー認証がOKの場合は、コールバックURL(http://localhost:5000)へリダイレクトされます。
 ⑥上記の①の時と同じようにAuthFilterが実行されますが、OAuth認証がされている状態なので処理はスルーされ、home.jspが表示されます。

 続いて、テンプレートアプリケーションのREST APIアクセスの流れは以下のようになっています。

テンプレートアプリケーションのREST APIアクセスの流れ
テンプレートアプリケーションの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は、無料で本番と変わらない環境での開発が可能です。他のクラウドサービスでは、起動していると課金されてしまうものもありますので、この点を考えると活用しないのは損な気がします。本記事を読んで気になった方がいらっしゃれば、是非アカウントを取得し、みなさんもいろいろ試してみて下さい。



バックナンバー

連載:database.comの世界
All contents copyright © 2007-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5