4

私はRESTベースのAPIに取り組んでおり、親子関係を表すための標準的な方法を理解するのに問題があります。(私はCXFでBeanを作成し、JAX-RSとJAXBを使用しています。CXFが提供する基本的な例から始めました)

私の問題は、あなたがフーとバーを持っているとしましょう。FooとBarには1-Nの関係があります。つまり、1Fooには多くのBarがあります。私の質問は、Fooが持っているバーを見つけるための標準的な方法は何ですか?そして、Fooが所有するBarリソースにアクセスするための標準的な方法は何ですか?

たとえば、Foosを次の場所にリストする可能性があることがわかりました。

GET http:// xxx / fooservice / foos

そして、次の場所で単一のfooを操作します。

PUT / UPDATE / DELETE http:// xxx / fooservice / foo / {fooid}

しかし、Foo 121が持っているバーをリストするにはどうすればよいですか?そして、どうすればそれらにアクセスできますか?デフォルトのJAXBマーシャラーは、Beanの属性だけをコレクションに出力しないように見えることに気づきました。したがって、Fooが次の場合:

Foo
  -文字列ID
  -文字列名
  -コレクションバー

JAXBは次のようなものを出力します。

<foo> <id> 123> / id> <name> foo name </ name> </foo><-bars属性がないことに注意してください

それが「ただ知っている」(私には悪いように思われる)場合を除いて、クライアントがFooにバーがあることを知ることを合理的に期待する方法がないため、これは問題があります。したがって、次を使用してバーのリストを取得することを想像できますが、

GET http:// xxx / fooservice / foo / 121 / bars

エンティティの出力がそれについて何も言わない場合、クライアントはどのようにしてFooにバーがあることを知るのですか?クライアントがリストを取得すると仮定すると、エンティティ操作は次のようになります。

GET / DELETE / UPDATE http:// xxx / fooservice / foo / 121 / bar / 435

Foo121が所有するBar435にアクセスします。

4

4 に答える 4

10

あなたがやりたいことは確かに可能です。リソースを設計する1つの方法は次のとおりです。

/foo
          # A list of all the Foo resource names (not representations).

/foo/{fooid}
          # A detailed representation of a particular Foo, including 
          # a list of all that Foo's Bar resource names (not representations).

/foo/{fooid}/bar/{barid}
          # A detailed representation of a particular Bar.

特定のFooの外部にバーが実際に存在しない状況が発生する場合があります(発注書のマスターとそれに含まれる詳細行の場合など)。これが事実であり、各Fooがそれに伴うすべてのBarデータを持っていない場合は、Foo表現で完全なBarの詳細を返すことができます。

/foo
          # A list of all the Foo resource names (not representations).

/foo/{fooid}
          # A detailed representation of a particular Foo, including 
          #   full details on each of its Bars.

通常、RESTリソースではより粗い粒度が必要です。これを選択した場合、Fooのバーを変更するには、Fooを取得し、Foo表現のバーを変更してから、Fooを配置することに注意してください。

シリアル化されたXML表現で何が起こっているのかわからない場合は、関連するコードを使用して2番目の質問を作成する必要があります。

于 2009-11-24T02:46:59.553 に答える
0

詳細な投稿に感謝します-あなたが説明することは、基本的に、あなたが提案するように各Foo内のバーの詳細な表現なしで私が行っていることですので、私はそれをほぼ正しく持っていたようです。

あなたが提案するように、Foo内のバーのコレクションがJAXBのXMLとしてマーシャリングされていない理由を別のQで調べます。

于 2009-11-24T07:11:19.413 に答える
0

テイラー、ジャージーのJAX-RSの実装は、XMLまたはJSONに変換するオブジェクトのListプロパティを確かに出力します。したがって、完成したばかりのアプリでは、UserStoreオブジェクトにプロパティusersがあります。これはリストです。

List<User> users = new ArrayList<User>();

ジャージーを使用してユーザーストアのXMLまたはJSONバージョンを発行すると、そのプロパティのユーザーの配列が取得されます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<users>
    <user>
        <firstName>John</firstName>
        <id>a29a377f-4329-4ec8-9459-b5b1c2efc38a</id>
        <lastName>Doe</lastName>
    </user>
    <user>
        <firstName>Jane</firstName>
        <id>bb4dad28-1263-440a-afc5-062a8566ef90</id>
        <lastName>Roe</lastName>
    </user>
</users>

{
    "user": [{
        "firstName": "John",
        "id": "a29a377f-4329-4ec8-9459-b5b1c2efc38a",
        "lastName": "Doe",
    },
    {
        "firstName": "Jane",
        "id": "bb4dad28-1263-440a-afc5-062a8566ef90",
        "lastName": "Roe",
    }]
}

おそらく、あなたが遭遇している問題は、あなたの財産がリストではなくコレクションであることに関連しているだけです...

于 2009-11-25T19:03:27.603 に答える
0

私にとって、この質問の答えはデータモデリングによって駆動されます。データモデリングの場合、質問は、複合キーを使用している場合は「子モデルに複合キーを使用するかどうか」であるため、そうでない場合は親IDをURIに入力する必要があります。子には複合ではない独自のIDがあるため、子IDでのみURLを使用できます。

これがデータモデリングの質問です!!!

于 2013-09-04T15:13:41.857 に答える