0

REST サービスを開発しましたが、何か間違ったことをしていることに気付きました。

たとえば、特定のデバイスに関する情報を取得するサービスがあります。各デバイスのアドレスは、ector.room.group.idです。この GET メソッドに対して実行した URI は次のとおりです。しかし、デバイス アドレスを区切るために(...)/services_devices/{sector}/{room}/{group}/{id}を使用すべきではなかったことに気付きましたよね? '/'このメソッドにアドレスを渡すにはどうすればよいですか? を使用してい';'ますか?

私のGETメソッドは次のとおりです。

@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public String getDeviceName(@PathParam("sector") int sector, @PathParam("room") int room, @PathParam("group") int group, @PathParam("id") int id) throws Exception
{
    String name = null;

    try {
            name = new DevicesManager().getDeviceName(sector, room, group, id); 
    } catch (Exception e) {
            e.printStackTrace();
    }
    return name;
}

これを変更する簡単な方法があります。正しい URI を取得するにはどうすればよいですか? 多くの方法でこの「エラー」があります。

4

2 に答える 2

0

REST アーキテクチャ スタイルには HATEOAS が導入されています。これは、クライアントとサーバーが疎結合であることを意味します。単純に、クライアントは URL がどのように見えるかを認識せず、以前の応答から取得します。(HTML ページをサーフィンするのと似ています)。もちろん、少なくとも 1 つの URL (エントリ ポイント) がクライアントに認識されます。この観点からすると、正しい URI が必要であることは重要ではありません。正しい URI は? URI の形式が RFC に準拠している場合、URI は正しいです。

おそらくRESTfulではないURLパターンを導入しています。これは、クライアントとサーバー間の緊密な結合を意味するためです(クライアントはURLパターンを認識し、それらからURLを構築する機能を備えている必要があります。あなたのケースでは、セクター/ルーム/などを埋めます. )

この投稿も参照してください。

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

私のアドバイスは次のとおりです。URL パターンに時間を無駄にしないでください。URL をできる限りシンプルにしてください。フラットな階層にも多くの利点があります。HATEOAS の原則に従ってください。

于 2013-04-09T10:00:12.113 に答える
0

リソースに階層がある場合は、パス変数が適切です。

あなたの場合、デバイスとアドレスの間に階層があるようですが、最初にアドレスが来て、デバイス名の後に来ます。「deviceName」は、もう 1 つの階層ステップと見なすことができます。

上記の関係を反映する最良の方法は、次の URL です。

(...)/セクター/部屋/グループ/id/デバイス名

次に、デバイスの別の属性を次のようにマップできます。

(...)/セクター/部屋/グループ/id/deviceOwner

JAX-RS マッピングは次のようになります。

@GET
@Path("{sector}/{room}/{group}/{id}/deviceName")
@Produces("application/json")
public String getDeviceName(@PathParam ...) {
//impl.
}

はい、deviceName がリソースの唯一の関連属性である場合は、「deviceName」を省略でき、元のマッピングは正しいです。

のリソースに/sector/room/group/id多くの属性がある場合は、パスの合成オブジェクトを返すことを検討する必要があります。

@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public Device getDeviceName(@PathParam...) {
}
于 2013-04-08T17:52:54.990 に答える