java - 在 REST/Java 中,如果我的对象为 null,我应该返回什么?

标签 java json rest jersey jax-rs

我有一个简单的 POJO,我用 REST 注释进行了注释,如下所示:

@GET
@Path("/domains/{domainid}")
@Override
public Domain getDomain(@PathParam("domainid") UUID domainID) throws Exception {
    logger.info("Retrieving domain "+ domainID);
    Domain d = null;
    try {
        d = MyClient.getDomains().get(domainID.toString());
        logger.debug("Returning "+d.getName());
    } catch (Exception e) {
        logger.error("Could not retrieve domain", e);
    }
    return d;
}

请注意,包含 d.getName() 的日志语句实际上可以抛出一个 NPE,然后被捕获并记录。这不是很漂亮,但这也不是这里的重点。

最终无论 d 是否有值,我都会返回它。

null 值的情况下,我的客户端收到 HTTP 204 状态代码。这是 wget 显示的内容:HTTP 请求已发送,正在等待响应...204 无内容

奇怪的是,我的浏览器丝毫不动。他们仍然显示上一页(我想当没有收到内容时留在原地是有意义的)。我本以为是空白页。

三个问题:

  • HTTP 204 是要返回的正确响应吗?
  • 如何通过注释来控制它?通过其他配置?
  • 关于空对象的标准 REST 最佳实践是什么?

谢谢

编辑

这里有一个关于同一主题的好问题:Is it correct to return 404 when a REST resource is not found?

最佳答案

如果请求试图获取/定位/查找资源,但无法找到,传统上,我们应该发送 404 Not Found。进一步讨论 see here .

也就是说,我通常喜欢让我的资源方法返回 Response,因为这样可以更轻松地按照我想要的方式微调响应(一点点 - 不多 - 更多细节 here )。但是看看您的方法如何覆盖接口(interface)契约(并返回模型对象),JAX-RS 为我们提供了一个很好的异常层次结构,它将映射到特定的响应/状态。该列表可以是 seen here

因此在您的特定情况下,如果无法找到资源,您可以抛出 WebApplicationException(Response.Status.NOT_FOUND)NotFoundException,并且异常将映射到 404 Not Found。有点像

d = MyClient.getDomains().get(domainID.toString());
if (d == null) {
    throw new NotFoundException();  // <-- JAX-RS 2.0
    // or throw new WebApplicationException(Response.Status.NOT_FOUND);
                                    // ^^  JAX-RS 1.x 
}

当抛出异常时,该方法将退出,客户端将收到状态为 404 Not Found 的响应。


相关问答


编辑

在第一行中,我声明“如果请求试图获取/定位/查找资源......”,但实际上,这适用于我们使用 URI templates 的几乎所有情况,无论是用于 GET、POST、PUT、DELETE 等等。考虑这个例子

@PUT
@Path("/customers/{id}")
public Response updateCustomer(@PathParam("id") long id, Customer customer) {
    ...
}

这是一种允许客户端通过 PUT 更新客户的方法。在尝试更新资源之前,客户端应该知道资源的完整 URI。如果在数据库中找不到 {id} 参数(用于查找),则资源不存在,并且还应向客户端返回 404 Not Found。

关于java - 在 REST/Java 中,如果我的对象为 null,我应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862500/

相关文章:

java - 听众层次结构

javascript - 如何为 JSON 对象设置原型(prototype)?

android - 代替 url [位置] 的图像加载器错误

java - 通过 POST 将数据从 Java 发送到 PHP

asp.net - 如何使用 Web API 上传文件和模型?

java - 使用服务内的广播接收器检测调用结束

java - GWT-Textcell 未触发 onclick 事件

javascript - 当 status=false 时,alert(data.status) 失败,但当 status=true 时则不会失败

mysql - 无法获取 id 的数据

java - 如何从非 Activity 类启动新 Activity