InterSystemsプラットフォームでのRESTful Web APIの構築-2

はじめに


4年前、私はHabréに関する最初の記事を書きました。この記事はInterSystemsプラットフォームでのRESTful Web APIの作成に当てられました。 それ以来、多くの時間が経過し、RESTful Web APIの作成作業を大幅に簡素化したいくつかの新しいリリースがリリースされました。 この記事ではこれらの変更について説明し、InterSystemsプラットフォームでRESTful Web APIを作成するためのヒントを提供します。


内容



RESTful Web APIアーキテクチャ


読者がRESTful Web APIとは何か、InterSystemsプラットフォーム(バージョン2014.1以降で利用可能)でのその実装の基本に精通していることを願っています。 これは、特に多くの記事/ウェビナー/トレーニングコースの主題であり、私の以前の記事です。 いずれにせよ、まず始めたいのは、RESTful Web APIを含むアプリケーションの一般的な高レベルのアーキテクチャです。 次のようになります。



この図は、決定の主なレベルを示しています。


データ


InterSystemsプラットフォーム上のストアドクラス。


ターミナルAPI


データインタラクションレイヤー。 このAPIを使用しない限り、データを変更しないでください。
このAPIのメソッドはデバイスに書き込みません。 端末APIは以下を返す場合があります。



Web API


着信要求を端末APIが理解できる形式に変換し、端末APIのメソッドを呼び出します。 端末APIの実行結果がクライアントに返されます。
Web APIはデータと直接対話しません。 RESTful Web APIではなくWeb APIという用語を使用しています。 Web APIは、たとえばHaSoですでに複数 記述ているInterSystemsプラットフォームでもサポートされているWebSocketプロトコルに基づいて、異なるアーキテクチャを使用して実装できます。


お客様


通常、JavaScript(ただし、必ずしもそうではない)アプリケーションはエンドユーザーが利用できます。 このレベルには、データベースとの直接接続がなく、メインのビジネスロジックがロードされ、アプリケーションの状態が保存されている必要があります。 通常、最も単純なビジネスロジックのみがこのレベルになります。承認インターフェイス、入力された値の有効性とフォーマットコンプライアンスのチェック、クライアントに既にアップロードされたデータ(並べ替え、グループ化、カウント)による簡単な操作。


この分離により、アプリケーションの構成可能性が向上し、エラーのデバッグ、検索、修正が容易になります。 本質的に、これはアプリケーション構築するための3層アーキテクチャです。


ブローカー


ブローカーは、RESTful Web APIのロジックを含むクラスです。 それらは:



パスの例:


 <Route Url="/path/:param1/:param2" Method="GET" Call="Package.Class:ClassMethod" /> 

ClassMethodは任意のクラスメソッドです。


ブローカーの分離


「物理」分離


RESTful Web APIには多くの方法(メソッド)があるため、1つのブローカーはすぐにメソッドでオーバーロードされます。 これを防ぐには、ブローカーを次のようにいくつかのクラスに分割します。
ブローカーの分離


どこで:



論理パーティションとバージョニング


通常、ブローカーにはパスが含まれています—呼び出されるURIとメソッドのマッピングですが、ブローカーはパスに加えて、相互に要求を「渡す」ことができます。 次のようになります。


 <Map Prefix="/form" Forward="Destination.Broker"/> 

これにより、ブローカーを関連付けられたサブジェクト領域に分割し、APIのバージョン管理を提供できます。


ブローカーの論理的な分離


ブローカーオプション


以下は、RESTful Web APIのブローカーに設定することが推奨されるパラメーターです。


 Parameter CONTENTTYPE = {..#CONTENTTYPEJSON}; Parameter CHARSET = "UTF-8"; Parameter UseSession As BOOLEAN = 1; 

責任は次のとおりです。



すべてのブローカーは1つの抽象ブローカーから継承するため、これらのパラメーターを抽象ブローカーで1回指定するだけで十分です(最初のスーパークラスのパラメーターのみが継承されます)。


コードの一般化


RESTful Web APIを記述するときによく発生する問題の1つは、ブローカーからブローカーへのコードのコピーアンドペーストです。これにより、大量のパスとコード行が作成されます。 これを回避するには、メソッドジェネレーターを記述するために必要なすべてのメタ情報を含む%Dictionaryパッケージと組み合わせてコード生成を使用することをお勧めします 。 コード生成の積極的な使用例は、RESTFormsライブラリです。 さらに、コード生成を使用すると、RESTful Web APIの均一性を高めることができます。


CORS


別のドメインのリソースへのアクセスをWebページに提供できる最新のブラウザーのテクノロジー 。 CORSを使用してRESTful Web APIへのアクセスを有効にするには、ブローカーに次のパラメーターを追加します。


 Parameter HandleCorsRequest = 1; 

これにより、他のドメインからのアクセスが提供されます。 これは安全ではないため、 OnHandleCorsRequestメソッドの署名もオーバーライドする必要があります。


 ClassMethod OnHandleCorsRequest(pUrl As %String) As %Status {} 

このメソッドは、リクエストの発信元を確認する必要があります。たとえば、Webアプリケーションのホスト名と一致する必要があります。 Originを取得するには、次の方法を使用できます。


 ClassMethod GetOrigins() As %String { set url = %request.GetCgiEnv("HTTP_REFERER") return $p(url,"/",1,3) // get http(s)://origin.com:port } 

認証


1人のユーザーが1つのライセンスを消費して1つのセッション内で作業するには、次の条件が満たされるようにシステム管理ポータルでRESTおよびCSPアプリケーションを構成する必要があります。


  1. すべてのブローカーで、 Parameter UseSession = 1;
  2. すべてのWebアプリケーションは、認証のみで使用できます。
  3. すべてのWebアプリケーションにはセッションタイムアウト(900、3600)があります。
  4. すべてのアプリケーションには、同じGroupById値がGroupByIdます。
  5. すべてのアプリケーションは同じCookie Path値を持ちます。

デバッグおよびテストツール


デバッグには、次のような外部ツールを使用できます。



curlやwgetなどのコマンドラインツールを使用しないことを強くお勧めします。


外部および内部デバッグツールについては、 InterSystems Developer Communityの一連の記事( パート1-外部ツールパート2-内部ツール )で詳しく説明されています。



以下に、RESTful Web APIの例をいくつか示します。


MDX2JSONとDeepSeeWebクライアント


MDX2JSON -RESTful Web APIは、特に、DeepSeeのキューブ、ピボット、ダッシュボード、およびその他の多くの要素に関する情報を提供します。MDXリクエストの実行結果により、最新のWebまたはモバイルアプリケーションの分析ソリューションのユーザーインターフェイスをDeepSeeに埋め込むことができます。 バージョン2014.1以降で動作します。
DeepSeeWebは、DeepSeeユーザーポータルの代替実装を提供するAngularJSアプリケーションです。 簡単にカスタマイズできます。 MDX2JSONをバックエンドとして使用します。 以下は、DeepSeeWebでレンダリングされたダッシュボードの例です。


ディープシーウェブ


DeepSeeに関する詳細な記事。


EnsembleWorkflowおよびEnsembleWorkflowUIクライアント


インターシステムズの統合プラットフォームには、自動化されたビジネスプロセスに参加できるEnsembleワークフローサブシステムがあります。 Ensemble Workflow RESTful Web APIおよびEnsembleWorkflowUIクライアント。 RESTful Web APIは、ユーザータスクへのアクセスを提供します。 バージョン2014.1以降で動作します。 これが視覚化の外観です。


EnsembleWorkflowUI


EnsembleWorkflowUI


RESTForms


RESTFormsは、最新のWebアプリケーション向けのInterSystems 2016.1+プラットフォーム上の汎用RESTful Web APIデータバックエンドです。


RESTFormsで使用できるパスの一部を次に示します。


URL説明
情報クラス一覧
情報/すべてすべてのクラスのメタ情報
info /:クラス1つのクラスのメタ情報
オブジェクト/:クラス/:idオブジェクトを取得
オブジェクト/:クラス/:id /:プロパティオブジェクトのプロパティを取得
オブジェクト/:クラスオブジェクトを作成
オブジェクト/:クラス/:id動的オブジェクトからオブジェクトを更新する
オブジェクト/:クラスクラスオブジェクトからオブジェクトを更新
オブジェクト/:クラス/:idアイテムを削除
オブジェクト/:クラス/:クエリSQLクエリを実行する

このプロジェクトでは、コードの一般化が積極的に使用されています(コード生成と%Dictionaryパッケージの使用)。


AngularおよびReactクライアントが利用可能です。次のようになります。


クラスリスト


ジョンソン


JavaScript Object Notationは、RESTful Web APIとともに使用されるテキストベースのデータ交換形式です。 InterSystemsプラットフォームでのJSONサポートはバージョン2009.2から登場しましたが、バージョン2016.2で大幅に改善されました。 ドキュメントで JSONの使用について詳しく読んでください。


結論



参照資料




Source: https://habr.com/ru/post/J345532/


All Articles