1

Web アプリケーションに 3 つのドロップダウン ピッカーがある。Web アプリケーションは、Restful サービスを使用してピッカー データを入力します。

/years最初の 2 つのピッカーは、や などから値を取得します/colors。3 番目のものは、2 つの設定に応じて値を取得する必要があります。

したがって、次のようなものになる可能性があります/models?year=1&color=red

問題は、これを HATEOAS に準拠させる方法です (開発者がモデルを取得するための URL を作成する方法を知る必要がないように)。

ルート/は、次のような多くのリンクを取得します。

{
"_links": {
      "colors": "/colors",
      "years": "/years",
      "models": "???" }
}

の代わりに何が必要???ですか? 何らかのテンプレートがあった場合/models?color={color}&year={year}、開発者は URL を作成する必要があります。これでよろしいですか?

または、取得した各色の年のリストへ/colorsのリンクと、取得した各年のモデルのリストへのリンクがある可能性があり/years?color=redますが、最初に色を選択し、次に年を入力してからモデルを入力する必要があります。色から移入された年だけでなく、色と年の両方にモデルを依存させたい場合、何か考えはありますか?

この状況で、ヘイトアズ準拠にすることさえ可能ですか?

4

1 に答える 1

0

HATEOAS については聞いたことがありませんが、今読んだところによると、サービスの消費者が「ステート マシン」で進むことができる場所へのリンクを返すことになっているようです。

あなたの場合、それは「関数呼び出し」であるリンクに変換されます。最初の 2 つ (/colors/years) は、パラメーターをとらない (この時点で「何か」を返す) 関数ですが、3 つ目は 2 つのパラメーターを受け取る関数呼び出しです。1 つは色の表現で、もう 1 つは年です。最初の 2 つは単純な URL で十分ですが、3 番目の場合は、パラメータ名/タイプ情報も含める必要があります。何かのようなもの:

{
  "_links": {
    "colors": "/colors",
    "years": "/years",
    "models": {
      "url": "/models",
      "param1": {"color"}
      "param2": {"year"}
    }
  }
}

注: 「色」と「年」についても、「モデル」と同じレイアウトを使用できます。

この時点で、クライアントは、関数にアクセスするための URL と、関数に渡されるパラメーター (存在する場合) の名前を認識します。

もう 1 つ欠けているのは、型です。「string」をそのまま使用することもできますが、「color」パラメータが実際に「/colors」が返す値であることは明らかではありません。色を説明する「タイプ」の色を導入できます (および色を操作する関数: 表示可能な名前、HTML カラー コードなどを指定します)。

「強化された」署名は次のようになります。

{
  "_links": {
    "colors": {
      "url": "/colors",
      "return": "/type/List?type=/type/Color"
    },
    "years": {
      "url": "/years",
      "return": "/type/List?type=/type/Integer"
    },
    "models": {
      "url": "/models",
      "param1": {
        "name": "color",
        "type": "/type/Color"
      },
      "param2": {
        "name": "year",
        "type": "/type/Integer"
      }
      "return": "/type/List?type=/type/Model"
    }
  }
}

注: パス "/type" は、タイプを関数から分離するためにのみ使用されますが、必須ではありません。

これにより、関数、それらが取るパラメーター、および関数が返す値が交換可能かつ発見可能に記述されるため、適切な場所で適切な値を使用できます。

もちろん、これをサービス側で実装するのは簡単ではありません (特に、"/type/List" のようなパラメーター化された型の場合 -- Java の Generics や C++ のテンプレートを考えてください) が、これが最も "安全" で "移植可能な" 方法ですクライアントへのインターフェースを説明できます。

于 2013-10-25T14:54:37.500 に答える