在使用 JAX-RS 发出发布请求时,我看到了一些关于响应状态代码的不同约定。
我见过这个:
Response.ok(//content or object).build();
我最初的想法是这是错误的,因为状态代码 200 只是表示“正常”,这是一个广义的术语,但由于我们有“已发布”,我认为 201 会更好,因为它还返回标题内的元素
Response.created(//content or object).build();
这是我想要实现的目标:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createUser(String content) throws CityNotFoundException
{
ReceivedCreateUser receivedUser = gson.fromJson(content, ReceivedCreateUser.class);
User createdUser = userFacade.createUser(receivedUser.name,
receivedUser.email,
receivedUser.password,
receivedUser.city,
receivedUser.gender,
receivedUser.dateOfBirth);
if(createdUser == null){
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return Response.ok(gson.toJson(UserDTO.basic(createdUser))).build();
}
我想将实体添加到响应中,但是created
只接受uri而不接受实体。
最佳答案
是否在 POST 请求上返回 201 在很大程度上取决于其背后的功能。如果您的端点在系统中创建一个新实体,那么 201 将是最佳选择,但 POST 也经常用于执行具有大型选项集的搜索请求。在这种情况下,如果有结果或没有结果,则需要 200 或 204。
但是要返回带有 POST 和响应 201 的实体,您可以执行类似的操作:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createUser(String content) throws CityNotFoundException
{
ReceivedCreateUser receivedUser = gson.fromJson(content, ReceivedCreateUser.class);
User createdUser = userFacade.createUser(receivedUser.name,
receivedUser.email,
receivedUser.password,
receivedUser.city,
receivedUser.gender,
receivedUser.dateOfBirth);
if(createdUser == null){
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
return Response
.created(new Uri("http://example.org"))
.entity(gson.toJson(UserDTO.basic(createdUser)))
.build();
}
关于java - 在 JAX-RS 中发出 POST 请求时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041138/