3

REST サービスを作成しましたが、意味のあるメッセージを GET 要求に送信するためのベスト プラクティスは何かと考えていました。基本的に、私の GET リクエストは、次のような特定のオブジェクトを返します。

@GET
@Path("/examsple")
@Produces(MediaType.APPLICATION_JSON)
public List<SomeObject> retrieveSomeObjs() {

    List<SomeObject> result = new ArrayList<>();
    try {
        result = ... Get SomeObjects ...;
    } catch (Exception e) {
        ... Deal with exception ...
    }
    return result;
}

エラーが発生した場合を除いて、応答が空のリストを返すだけです。何が問題なのかを説明するメッセージの方が便利です。ただし、戻り値の型がリストであるため、文字列メッセージを返すことはできません!

私の現在の解決策は、戻り値の型をマップに変更することです。その後、マップにラップされたオブジェクトをメッセージと共に返すことができます。ただし、クライアント側では少し厄介であり、組み込みのソリューションまたはこれに対する「受け入れられた」ソリューションがあるかどうか疑問に思っていました。

4

3 に答える 3

5

クライアントがエラーを起こした場合は、HTTP 応答コードを使用します。アイテムが見つからない場合、応答は404 Not Found. ユーザーがオブジェクトにアクセスする権限を持っていない場合は、403 Forbidden. 現在、あなたはそうでは200 OKないのにすべてがOKだと言っています。

サーバー側でエラーが発生した場合、その情報をクライアントに送信したくありません。サーバーでエラーをキャッチし、意味のあること (ログに記録するなど) を行い、コードを変更して再発しないようにします。

于 2013-07-04T12:55:58.213 に答える
1

既に述べたように、GET リクエストの一般的なエラー コードには次のようなものがあります。

  • 301 Moved Permanently- リソースが移動された場合
  • 400 Bad Request- クライアントのリクエストが受け入れられない場合、つまり、クライアントがリクエストで意味のないパラメータを送信した場合
  • 401 Unauthorized- クライアントが有効な資格情報を提供しなかった場合
  • 403 Forbidden- クライアントが承認されているが、リクエストの実行が許可されていない場合 (この場合、このリソースが存在することを隠すために 404 を返すこともできます)
  • 404 Not Found- 要求されたリソースが見つからなかった場合

私は通常、これらのエラー メッセージを表す POJO を作成し、それを JerseyResponseオブジェクトを使用して返します。

たとえば、エラー オブジェクトは次のようになります。

public class ApiError {

    private String status;
    private String code;
    private String message;
    private String developerMessage;

    // Getters and Setters here

}

それを返すには、次のようにします (つまり、catch ブロックまたはカスタム ExceptionMapper で)。

ApiError error = new ApiError("409", "409-1", message, developerMessage);
return Response.status(Response.Status.CONFLICT).entity(error).build();

このようにして、適切にフォーマットされた JSON/XML エラー メッセージを提供して、カスタム エラー コードと詳細情報を開発者に提供できます。エラー エンティティは、@Produces注釈に従ってシリアル化されます。

于 2013-07-04T13:55:22.940 に答える
1

ヘッダー内の HTTP エラー ステータス コードと、例外を説明するオブジェクトを含む JSON 応答本文を返すことができます。

于 2013-07-04T12:52:58.223 に答える