2011-01-31 4 views
0

私はユーザードメインオブジェクト(JAXBを使用)のマーシャリングされたXML表現で/ user/{userId}に応答するRESTful Webサービスを持っています。クライアントに期待している情報が返ってこない場合は、そのリクエストに関する追加の詳細情報をクライアントに返信する適切な方法は何でしょうか?非分散Javaアプリケーションでは、データアクセスまたはセキュリティ例外を処理するキャッチブロックがある可能性があります。/user/{userId}が何も返さない場合(例えば、Webサービス永続化メカニズムが動作していない、セキュリティ制限などがあります)、クライアントへの応答に意味のある情報を含めるにはどうすればいいですか?RESTful WSを介して戻る前にオブジェクトにメタデータを追加する適切な方法は何ですか?

私は、ドメインオブジェクトのさまざまな表現を探しているわけではないので、DTOは私が必要と考えるものではありません。むしろ、私はクライアントが期待した情報を返すことを妨げていた要求の間に何が起こったかについての情報を探しています。関連するメタデータを保持する一種のResponseObject内にドメインオブジェクトを囲むことは適切でしょうか?このアプローチの欠点は、同じメタデータ要件を持たない非RESTfulな実装を提供する可能性があるため、サービスレイヤーのインターフェイスにすべてResponseObjectがあることです。

答えて

3

特に、期待している情報が返されない場合は、クライアントのリクエストに関する追加情報をクライアントに返信する適切な方法は何ですか?

/user/{userId}が何も返さない場合(Webサービスの永続化メカニズムが機能していない、セキュリティ制限などがあるなど)、どのように意味のある情報をクライアントへの応答?

これは、HTTPステータスコードがRESTfulサービスで使用されるものです。

userIdが実際のユーザーに対応していないことを示すには、404 Not Foundを返すことができます。

アプリケーションに内部エラー(データベースに接続できないなど)を示す場合は、500 Internal Server Errorを返すことができます。

ResponseObjectにあなたの返品をラッピングするというオプションは本当の「応答ステータス」を含んでいますが、SOAPのように非常に聞こえます。

RESTの美しさ、つまり少なくとも人が主張するものは、既存のHTTP応答ステータスコードを使用して、実際の応答のほぼすべてのステータスをモデル化できるということです。

+0

+1は「SOAPのように酷く聞こえる」という意味です。 SOAPのやり方は、RESTを魅力的にするものであり、私はプロトコルを後方に曲げたくありません。私は個人的にはHTTPステータスコードの手法を提案していますが、代替案については不思議に思っていました。 – Fil

+1

RESTサービスを作成している場合は、サービスのユーザーにAPIを正しく処理させるために、可能な応答コードと、いつ/なぜそれらがあなたのドキュメントに記述されるべきかを述べる必要があります。例えば、 'GET/users/{userId}というユーザ呼び出しを取得するためです。可能な応答は、XML形式のユーザのペイロードを含む200、またはIDが見つからない場合は404、クライアントのフォルトではない内部サーバエラーがある場合は500などである。可能な応答を文書化する以外に、あなたの手からあなたはクライアントに必要なすべての情報を提供しています。 –

+1

+1これはRESTのポイントです.HTTPプロトコルには、あなたが求めていることを処理するためのメカニズムが既に用意されているため、RESTはそのようなことを特にサポートしていません。ユーザーが見つからない場合は404を返し、内部エラーの場合は500を返します。サービスにセキュリティがある場合は、401または403を返すことがあります。フォーマットが間違っている(userIdの非数値など)場合は、400を返します。 – Qwerky

1

セキュリティ上の問題(セキュリティ上の問題、DB接続なし、提供されたIDのユーザーが見つからない場合)は、例外をスローするだけです。クライアントは障害を受け取り、その情報に含まれる情報に従って動作します。

どの実装を使用していますか?例えば、Apache CXFでは、例外ハンドラとレンダリングXMLを自分で定義して、好きなメタ情報を自由に組み込むことができます。

+0

私は、現時点でジャージーを使用していて、以下の@ reverendgreenの答えは、ジャージーのExceptionMapperにuserfulの参照を持っています。 – Fil

1

例外を使用して情報を取得し、適切なステータスコードを持つHTTP応答にそれらの例外をマップします。これを実現するには、JAX-RSを使用している場合はExceptionMapperの実装を作成するか、Restletを使用している場合はStatusServiceをサブクラス化できます。

http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features http://wiki.restlet.org/docs_2.0/13-restlet/27-restlet/331-restlet/202-restlet.html

+0

ExceptionMapperは私が必要とするものです。ありがとう。 – Fil

関連する問題