web-dev-qa-db-ja.com

RESTfulの単一のエンドポイントで異なるリソースを取得するにはどうすればよいですか?

私はREST Webサービスがあり、CompanyとUserのようないくつかのリソースがあります。しかし、会社、ユーザー、そしておそらく他のタイプを組み合わせた特別なリストを返すようにAPIを変更する必要がありますさまざまなタイプのリソースを含む推奨事項のリストのように。

これを解決するための最良のアプローチはどれですか?

次のような新しいエンドポイント(リソース)を作成する必要があります:/recommendations?私はすでに/companyエンドポイント、および/userエンドポイントは対応するオブジェクトを返します。これで結構です。しかし今、私はユーザーと会社の組み合わせで配列を返す方法が必要です。

また、jsonはオブジェクトの配列のように見えると思いますが、配列内のすべてのオブジェクトが異なるリソースである場合、クライアントはどのタイプのオブジェクトを解析しているのかをどのように知ることができますか?

[〜#〜]編集[〜#〜]

クライアントにアプリのおすすめ画面を表示してほしい。問題は、このリストが複数のタイプのデータ(ユーザー、会社)を組み合わせることができることです。このリソースに関係があるかどうかは関係ありません。クライアントはそのようなjsonを受け取ります。

"recomendations": [
    {
        "id_user": 1
        "name": "Jean"
        ...
    },
    {
        "id_company": 2
        "name": "Starbucks"
        ...
    },
    ...
]
7
alejandromp

おすすめのリソースを/recommendationsにマッピングし、次の構造を使用します。

{
   "users" : [ 
           { .. }, 
           { .. }, ..
    ],
   "companies" : [
           { .. }, 
           { .. }, ..
    ]
}

これにより、コンシューマは名前(たとえば、usersまたはcompanies)に基づいて適切に解析できます。

4
Martin Wickman

私は、推奨事項のすべての関連情報を含む個別の推奨事項タイプを定義します。モデルでは、このタイプはnotをデータベーステーブルに直接マップしますが、その内容を(おそらくSQL UNIONを使用して)UserテーブルとCompanyテーブルの両方から取得します。

CompanyとUserの間の関係について想定せずに、さまざまなタイプのオブジェクトの構成を返す素敵な方法が必要だと思います。これを行う方法を明確に定義する標準提案、ハイパーテキストアプリケーション言語があります。次に例を示します。

GET /recommendations HTTP/1.1
Host: example.org
Accept: application/hal+json

HTTP/1.1 200 OK
Content-Type: application/hal+json

{
    "_links": {
    "self": { "href": "/recommendations" },
    "next": { "href": "/recommendations?page=2" },
    "find": { "href": "/recommendations{?id}", "templated": true }
},
"_embedded": {
    "recommendations": [{
        "_links": {
            "self": { "href": "/recommendations/123" },
            "users": { "href": "/users/98712" },
            "companies": { "href": "/companies/7809" }
       },
     },{
         "_links": {
             "self": { "href": "/recommendations/124" },
             "users": { "href": "/users/97213" },
             "companies": { "href": "/companies/12369" }
         },
    }]
},
}

ExampleDocument からコピー

2
imel96