使用Google Cloud Endpoints返回错误

时间:2013-03-02 10:14:59

标签: google-app-engine google-cloud-endpoints

我的端点生成如下:

public Book insertBook(Book book) {
    PersistenceManager mgr = getPersistenceManager();
    try {
        if (containsShout(book)) {
            throw new EntityExistsException("Object already exists");
        }
        mgr.makePersistent(book);
    } finally {
        mgr.close();
    }
    return book;
}

我想知道如何将错误返回给客户端。 例如。这本书包含一些必填字段,ISNM检查等。

所以我会假设抛出一个异常,但是它如何映射到返回的json响应。 json repsonse应包含所有字段错误以突出显示客户端中的这些字段。

3 个答案:

答案 0 :(得分:5)

通常,异常会映射到响应中的500 http状态代码。除以下例外,您可以获得不同的代码: com.google.api.server.spi.response.BadRequestException - > 400 com.google.api.server.spi.response.UnauthorizedException - > 401 com.google.api.server.spi.response.ForbiddenException - > 403 com.google.api.server.spi.response.NotFoundException - > 404

如果您在Android中使用端点,则错误代码将在抛出的IOException中,您可以在catch中做出相应的反应。

答案 1 :(得分:3)

我尝试过这样的事情,似乎对我有用。

class Response<T> {
   Status status; 
   String userFriendlyMessage;
   T object; //your bean or entity object

   RestResponse toRestResponse() {
      RestResponse r = new RestResponse();
      r.status = status;
      r.userFriendlyMessage = userFriendlyMessage;
      r.object = object;
   }
}

您无法从端点返回通用对象。因此,创建一个等效的RestResponse类,可以从Response创建。

class RestResponse {
   Status status;
   String userFriendlyMessage;
   Object object;
}

状态可以是这样的。

public enum Status {
   SUCCESS, RESOURCE_NOT_FOUND, RESOURCE_ALREADY_EXISTS; //etc
}

所有端点方法都将返回RestResponse,而RestResponse又将从Response构造(T可以是您的bean或实体对象)。

当你反序列化你的json响应(RestResponse)时,你可以直接将它反序列化为Response。

希望这有帮助。

此致 沙迪亚

答案 2 :(得分:0)

我这样做是通过一个抽象类Entity。

它有一个ResponseCode,它是一个枚举和一个String ErrorMessage。

所以“Book”可以从Entity继承。你的回答可能如下:

public Book insertBook(Book book) {
    PersistenceManager mgr = getPersistenceManager();
    try {
        if (containsShout(book)) {
            book.setResponseCode(ResponseCode.ERROR);
            book.setError("Object already exists");
        } else {
            mgr.makePersistent(book);
        }
    } finally {
        mgr.close();
    }
    return book;
}