restful 网络服务中的输入数据验证(使用或不使用空对象)
Input data-validation in a restful web service (to use null-object or not to)
下面是一个网络服务,它提供了所有具有给定 Id 的书籍中的最新版本。
//资源控制器
@Path("latestVersionBook/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getLatestVersionBook(long id){
bookList=service.getLatestVersionBook(id)
return Response.ok(bookList).build();
//后台服务 下面是使用jpa获取图书的服务方法
public getLatestVersionBook(long id){
Query query = entityManager.createQuery("from Books where id = :id");
query.setParameter("id", id);
return query.getResultList().get(0);
}
如果 id 无效(table 中不存在任何书籍),此代码将抛出 NullPointerException
。
由于视图层的转换是 UI 呈现 ID 列表--> 用户发送对其中一个 ID 的请求。
因此,通常情况下返回的列表将是 null.Should 我检查是否为 null 或让代码抛出 NullPointerException
并让异常映射器将响应生成为 BAD_REQUEST
.
如果我检查 null/return 空列表,那么我也必须在资源控制器中检查相同的内容以生成带有 Bad_Request 的响应。
if(!bookList.isEmpty())
return Response.status(Status.BAD_REQUEST).build();
else
return Response.ok(bookList).build();
此外,将这种验证(需要数据库访问)置于 Jersey 可用的输入验证级别似乎不是一件好事/Spring 与我将做的类似的框架select 在服务中和自定义验证期间检查 Id 是否存在。
进行此类验证的最佳做法是什么?
PS:我不确定上面的代码是否会给出具有最新(最后)id 的 book 对象,如果 id 是自动递增的 field.And 查询可以修改为获取仅预订最后 Id.However 以上问题假设这有效
这将是一种方法:
if(bookList != null && bookList.size() > 0){
//HTTP 200 OK
return Response.status(Response.Status.OK).entity(bookList).build();
}
else{
//HTTP 204 NO CONTENT
return Response.status(Response.Status.NO_CONTENT).entity("Book not found").build();
}
在这种情况下,我们通常会发送 404。URL 是资源的标识符。如果 URL 的一部分用作确定资源的标识符,则该标识符未找到资源的适当回复是 404 Not Found。
一般来说,我个人所做的只是抛出一个异常,让 Jersey 处理它。例如
if (book == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND));
}
Jersey 将为我们处理此异常并发送 404 状态。我们可以很容易地自己处理 Response
,但这只是我养成的习惯,抛出异常。 AFAIK,没有真正的 convention/best 实践,至于哪个更好,但有时你会被绑定到一个接口契约,并且返回一个 Response
是不可能的。在这种情况下,抛出异常是有意义的。
以下是您可能会感兴趣的一些资源:
Is it correct to return 404 when a REST resource is not found?
In REST / Java, what should I return if my object is null?
下面是一个网络服务,它提供了所有具有给定 Id 的书籍中的最新版本。 //资源控制器
@Path("latestVersionBook/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getLatestVersionBook(long id){
bookList=service.getLatestVersionBook(id)
return Response.ok(bookList).build();
//后台服务 下面是使用jpa获取图书的服务方法
public getLatestVersionBook(long id){
Query query = entityManager.createQuery("from Books where id = :id");
query.setParameter("id", id);
return query.getResultList().get(0);
}
如果 id 无效(table 中不存在任何书籍),此代码将抛出 NullPointerException
。
由于视图层的转换是 UI 呈现 ID 列表--> 用户发送对其中一个 ID 的请求。
因此,通常情况下返回的列表将是 null.Should 我检查是否为 null 或让代码抛出 NullPointerException
并让异常映射器将响应生成为 BAD_REQUEST
.
如果我检查 null/return 空列表,那么我也必须在资源控制器中检查相同的内容以生成带有 Bad_Request 的响应。
if(!bookList.isEmpty())
return Response.status(Status.BAD_REQUEST).build();
else
return Response.ok(bookList).build();
此外,将这种验证(需要数据库访问)置于 Jersey 可用的输入验证级别似乎不是一件好事/Spring 与我将做的类似的框架select 在服务中和自定义验证期间检查 Id 是否存在。
进行此类验证的最佳做法是什么?
PS:我不确定上面的代码是否会给出具有最新(最后)id 的 book 对象,如果 id 是自动递增的 field.And 查询可以修改为获取仅预订最后 Id.However 以上问题假设这有效
这将是一种方法:
if(bookList != null && bookList.size() > 0){
//HTTP 200 OK
return Response.status(Response.Status.OK).entity(bookList).build();
}
else{
//HTTP 204 NO CONTENT
return Response.status(Response.Status.NO_CONTENT).entity("Book not found").build();
}
在这种情况下,我们通常会发送 404。URL 是资源的标识符。如果 URL 的一部分用作确定资源的标识符,则该标识符未找到资源的适当回复是 404 Not Found。
一般来说,我个人所做的只是抛出一个异常,让 Jersey 处理它。例如
if (book == null) {
throw new WebApplicationException(Response.Status.NOT_FOUND));
}
Jersey 将为我们处理此异常并发送 404 状态。我们可以很容易地自己处理 Response
,但这只是我养成的习惯,抛出异常。 AFAIK,没有真正的 convention/best 实践,至于哪个更好,但有时你会被绑定到一个接口契约,并且返回一个 Response
是不可能的。在这种情况下,抛出异常是有意义的。
以下是您可能会感兴趣的一些资源:
Is it correct to return 404 when a REST resource is not found?
In REST / Java, what should I return if my object is null?