java - 在 JAX-RS 中发出 POST 请求时的最佳实践

标签 java rest web jax-rs

在使用 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/

相关文章:

java - 如何使用JLabel?

Node.js Express 嵌套资源

html - Logo 未显示在网页标题中

java - 迭代和扫描未按预期工作

java - 当我设置此按钮的可见性消失时出现了一个 SCSS

api - REST API : Where should I code my workflow?

rest - 在 Grails 中使用 Spring-Security-Rest 插件拦截登录调用

javascript - Firefox 上的正则表达式问题

python - Django 用户表作为外键

java - 可作为方法引用运行