Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

MuleSoft AnyPoint Studio で kintone をデータソースとした Customer アプリ参照APIを作成する:CData kintone MuleSoft Connector

この記事は MuleSoft Advent Calendar 2019 の9日目の記事として投稿しています。

qiita.com

今回この記事では、CData Software で提供しているkintone をデータソースとして、kintone の顧客管理用のアプリを抽象化したAPIを作成してみようと思います。

f:id:sugimomoto:20191209203429p:plain

そもそもなぜ抽象化したAPIを作成するのか?

この記事で実際にできあがるものは、シンプルなAPI一つです。

以下のような kintone の顧客管理用アプリ(Customersとしています)を

f:id:sugimomoto:20191209203435p:plain

「GET 0.0.0.0:8081/api/customers/1」のようなHTTPリクエストで取得できるようにする、というものです。

f:id:sugimomoto:20191209203444p:plain

でも、kintone をご存知の方であれば、別に kintone のAPIをそのまま実行すればいいだけじゃないか? と思いませんか?

ここからは、MuleSoft のコンセプトそのものの話(詳しくはこちらもどうぞ https://qiita.com/mitch_oka/items/63d6323782c27e02fba6)となりますが、MuleSoftは単純なAPI作成のサービスではなく、企業のビジネスモデルをAPIという側面から全体整理し開発者・エンドユーザーへのエクスペリエンスを高めるためのトータルソリューションです。

それは、RDBで構成されたデータをAPI化するといった単純なものではなく、すでに企業内に存在する各種SaaSやPaaSのAPIも含めて、APIファシリティを整え、オーケストレーションし、監視・管理を行います。

おそらくそのアーキテクチャを端的にわかりやすく示しているのが、MuleSoftが推奨している以下の3レイヤーの考え方でしょう。

f:id:sugimomoto:20191209203449p:plain

https://www.MuleSoft.com/resources/api/leveraging-digital-transformation-right

すべての企業データは現在様々なサービス・DB(RDB・NoSQL問わず)管理され、フロントエンドはそれらの情報単一のデータソースではなく、複合的なデータソースから、特定のビジネスシナリオを元に要求します。

そうなった時、各データソースのAPIエクスペリエンスがばらばらであっては、開発はもちろんのこと、再利用性、監視、管理の観点で大きくコストが発生します。顧客のデータを取得したいのに、取得したいデータの実体は、SalesforceとMarketoとSAPに存在していた、そしてそれら一つ一つの仕様の違うAPIリクエストロジックを書いていたら・・・、と考えると、なかなか怖いことがイメージできるのではないでしょうか。

MuleSoftはそこをまず、System APIs レイヤーとして、データモデルベースでシンプルなAPIとして調え、Process APIsレイヤーでフロントエンドの要求するAPIの処理を束ねます。

これにより、様々な媒体・チャネルから要求されるAPIのエクスペリエンスを高めようというのが、MuleSoftのコンセプトであると考えられます。

そんなMuleSoftでは、System APIs レイヤーの拡張性を高めるために、数々のコネクターを提供しています。SalesforceやBox、Marketoなど、50種類ほどの提供されています。

https://docs.MuleSoft.com/connectors/

しかしながら、例えばSendgridやSharePointを使いたい、もしくは日本国内の企業であれば kintone や Sansan に顧客情報が管理されていて、それらをデータソースとして使えないと厳しいといった場合もあると思います。

そこを、CData MuleSoft Connectors でカバーしてしまうというのが今回のお話です。

f:id:sugimomoto:20191209203458p:plain

kintone Cusomter API の作り方

それでは、早速 kitnone Cusotmer APIを作ってみたいと思います。なお、必要な環境はMuleSoft AnyPoint Studioに準じます。

また、Design CenterとExchangeも使うので、予めAnypoint Platform のアカウントも用意しておいてください。

今回作成するAPIは、以下のRAMLで定義されたシンプルなAPIです。

gist.github.com

前述の通り、以下のようなAPIリクエストを行い、URIに含まれるIDを元にして、kintone の Customer アプリを検索し、レスポンスを返します。

「GET 0.0.0.0:8081/api/customers/1」

kintone MuleSoft Connector のダウンロード・セットアップ

最初に kintone MuleSoft Connector をダウンロードします。以下のURLからトライアルがダウンロード可能となっています。

https://www.cdata.com/drivers/kintone/mule/

f:id:sugimomoto:20191209203521p:plain

ZIPファイルがダウンロードできるので、任意のフォルダへ解凍してください。

f:id:sugimomoto:20191209203529p:plain

トライアルライセンスはjava コマンドから実行することで、アクティベーションできます。

java -jar cdata.muleLicenseInstaller.kintone.jar

f:id:sugimomoto:20191209203535p:plain

API定義の作成

次にAnypoint Platform にログインし、Design Center を使って、API定義を作成します。

f:id:sugimomoto:20191209203544p:plain

「Design Center」→「Create API specification」を選択し

f:id:sugimomoto:20191209203554p:plain

Code editor でCustomer APIを作成します。

f:id:sugimomoto:20191209203601p:plain

https://gist.github.com/sugimomoto/d4b9dbee5955767166ef2d55adbb6212」のRAML定義を貼り付けて、ExchangeにPublishすれば準備完了です。

f:id:sugimomoto:20191209203607p:plain

AnyPoint Studio の準備

次に、AnyPoint Studioを立ち上げてプロジェクトを作成します。

ここで、API 定義をExhcnageからインポートします。

f:id:sugimomoto:20191209203615p:plain

対象のAccountを追加し、Cusomter APIを検索すると、先程Exchangeに登録したAPI定義が表示されるので、これを追加します。

f:id:sugimomoto:20191209203620p:plain

併せてProject内で kintone MuleSoft Connector を使えるようにセットアップします。

「Install Artifact in local repository」をクリックし

f:id:sugimomoto:20191209203626p:plain

先程配置したkintone MuleSoft connector の「KintoneMuleSoftConnector\connectors」フォルダから「cdata-kintone-connector-19.0.7216-mule-plugin.jar」を参照して、インストールします。

f:id:sugimomoto:20191209203631p:plain

f:id:sugimomoto:20191209203635p:plain

あとはProjectの「pom.xml」を開いて、以下のXMLを追加(バージョンはHelpに記載されているものを使用してください)すれば設定完了です。

        <!-- CData kintone -->
        <dependency>
            <groupId>org.cdata.connectors</groupId>
            <artifactId>cdata-kintone-connector</artifactId>
            <version>19.0.7216</version>
            <classifier>mule-plugin</classifier>
        </dependency>

f:id:sugimomoto:20191209203644p:plain

うまく設定されていれば、以下のようにCData kintone MuleSoft Connectorの各モジュールがパレットに表示されます。

f:id:sugimomoto:20191209203650p:plain

Cusomter APIの処理を実装する

それでは、実際にCusomter APIの内部処理を作っていきましょう。

まずは、ListnerでAPIをコールできるように設定を行います。

f:id:sugimomoto:20191209203715p:plain

今回はローカルだけで試すので、ProtocolはHTTP、Hostは「0.0.0.0」、Portは「8081」を設定しました。

f:id:sugimomoto:20191209203721p:plain

次に、kitnone からのデータ取得処理を記述します。パレットからCData kintone の「Select」モジュールを以下のように配置します。

f:id:sugimomoto:20191209203726p:plain

Connector Configrationをクリックし、kintone への接続情報を入力します。最低限必要な情報は以下の3種類です。

  • URL:kintone のURL:例 htt@s://XXXX.cybozu.com
  • User:kintoneのログインユーザー
  • Password:kintone のログインユーザーパスワード

入力後 Test Conection をクリックし、接続で切れいればOKです。

f:id:sugimomoto:20191209203733p:plain

次に、kintone からデータを取得する部分を記述します。CData kinonte MuleSoft Connector はkinonte のAPIRDBに仮想化し、SQLでデータの操作を可能にします。

まず、InputParameterでURLパラメータから渡ってきて、事前に変数に格納されているcustomerIdを定義します。「{"Id": vars.customerId}」

次にSQL Query のフォームでIDを元にkintone の Recordを検索するクエリ「SELECT * FROM Customers Where RecordId = :Id;」を書きます。これだけで、kintone のAPI仕様を意識することなく、データの取得処理を記述できます。

f:id:sugimomoto:20191209203739p:plain

あとは、取得したデータを最終的なレスポンスのJSONマッピングします。

Transform Messageにて、渡ってきたPayloadの最初のレコードを変数に格納し、kintoneの各カラムをマッピングします。MuleSoftが海外のプラットフォームなので若干心配だったんですが、日本語カラムも問題なく利用できるのがいいですね。

%dw 2.0
output application/json
var customer = payload[0]
---
{
  customerId: customer.RecordId,
  companyName: customer."会社名",
  customerFullName: customer."担当者名",
  address: customer."住所",
  email: customer."メールアドレス"
}

f:id:sugimomoto:20191209203747p:plain

それでは、APIを実行してみましょう。「Run」ボタンをクリック後、APIが実行状態になるのを待ちます。

f:id:sugimomoto:20191209203755p:plain

実行されたら、PostmanやCURLなどから、HTTPリクエスト「GET 0.0.0.0:8081/api/customers/1」を投げます。

すると、以下のようにkintone からレコードを検索し、顧客情報が取得できました。番号を変えると、その番号に応じて、kintone を検索してきます。

f:id:sugimomoto:20191209203802p:plain

おわりに

今回は 参照API を作成する部分を中心として行いましたが、CData MuleSoft ConnectorはINSERT・UPDATE・DELETEにも対応しているので、例えば問い合わせフォーム用のAPIを作成し、kintone へ顧客登録し、Salesforceに問い合わせ情報を入力する、みたいなことも可能になります。

ぜひ企業内の様々なAPIの構築、統合、管理に活用してみてください。

https://www.cdata.com/jp/mule/