web-dev-qa-db-ja.com

SQLクエリをREST APIリクエストに変換する方法は?

機械で読み取り可能な説明があるとします( [〜#〜] wadl [〜#〜]Swagger または [〜#〜]など) raml [〜#〜] )RESTデータベースのインターフェースを提供するAPI。

ユーザーは、基になるデータベースに関するクエリをSQLまたは同様のクエリ言語の形式で送信します。ただし、REST APIを介してのみ、データベースに直接アクセスできません。

そのようなSQLクエリを特定のREST APIへのリクエストのシーケンスに変換するシステムを(できれば説明から半自動で)構築するには、どのアプローチを選択しますか?

そのような問題をどのように表現しますか?役立つアルゴリズム、理論的フレームワーク、またはツールはありますか?

REST APIは以下をサポートします:

  • 読み取り専用操作、つまりSELECT SQLクエリのみ
  • XPartial プロジェクション(例:/persons?fields=firstname,lastname
  • [〜#〜] rsql [〜#〜] 制約(/persons?query=firstname==John;department.code==42、参照 他の例 )。

テーブル間の一部の参照(外部キー)は、REST API(上記の制約の例ではPerson.departmentなど)で属性として表されますが、一部の参照はサブリソース(例/persons/{userName}/projects)これは、一部のクエリでは、RESTリクエストの観点から答えられるように「計画」を考案する必要があることを意味します。

例:「Chuck Norrisのアクティブなプロジェクトの名前」のクエリは、次のように変換されます。

  1. /persons?query=firstname==Chuck;lastname==Norris
  2. 結果からuserNameを取得
  3. /projects/{userName}?fields=name&query=state==ACTIVE
8
Jakub Stejskal

技術的には、クエリ言語はRESTサービスが理解する必要のあるもう1つの標準です。クエリパラメータにマップする必要はありません。たとえば、Hydraによって、たとえば次を含む単一のクエリパラメータを定義できます。 SQL。必要なのは、SQLを記述できる語彙と、SQLを構築できるクライアントとSQLを理解できるサーバーだけです。一般的な語彙は、この場合のクライアントとサーバー間の契約です いくつかこれについて話します。 独自のクエリ言語を作成する必要はなく、既存のクエリ言語を再利用できます...

WADLと他のREST説明言語は不適切なスタートです。これは、RESTに niform interface /HATEOAS制約があるため、クライアントが状態を変更するには、ハイパーリンクを使用する必要があります。クライアントは、セマンティクスをチェックして、選択するハイパーリンクを決定する必要があります。リンクメタデータ(リンク関係など)には、そのセマンティクスが含まれています... WADLなどの言語では、リンクはありません。リンクメタデータ、またはセマンティクス、およびRESTクライアントは、RESTサービスから分離されていないため、再利用できません。:S

1
inf3rno