【问题标题】:RESTful put id and bodyRESTful put id 和 body
【发布时间】:2016-12-05 12:16:20
【问题描述】:

我需要让我的 Java 服务器接收 PUT 请求以从 id 和 json 正文创建新用户,URI 需要如下:

/usermanagement/user/$id { "name":john, "type":admin }

鉴于我已经制作了一个简单的 Java 类,并且以后可以使用 Jackson 将 JSON 转换为 POJO,这是我的问题: 如何指定 PUT 请求以同时接受 id 和 JSON 正文作为参数?到目前为止,我得到了:

 @PUT
    @Path("{id}")
    @Consumes(MediaType.APPLICATION_JSON) 
    public String createUser(@PathParam("id") int id){
        User user = new User();  
        User.setId(id);

        return SUCCESS_MSG;
    }

这可行,但我没有运气添加 JSON 主体并让函数解析它。我试过了:

public String createUser(@PathParam("id") int id, String body){
     return body;
}

在 Postman 中测试时应该返回相同的输入 JSON,但是它总是返回“资源不可用”错误。

我觉得我在这里缺少一些明显的东西?

【问题讨论】:

  • 我认为你需要添加一个未修饰的参数来接收你的身体。 public String createUser(@PathParam("id") int id, String body)
  • 这是我尝试的第一件事,执行查询时它总是给我一个“资源不可用”的错误。
  • 听起来更像是库问题而不是您的代码,但我猜 - 抱歉
  • 您确定要您的用户定义 ID 吗?我会选择POST 和数据库生成的 ID。
  • 此时生成方法无关紧要,这仅适用于大学作业

标签: java json rest put


【解决方案1】:

根据 REST API 约定,需要像 /usermanagement/users 这样的 uri 上的 POST 方法。 PUT 方法用于更新现有资源。您可以阅读这篇关于如何设计实用的 RESTful API 的精彩文章。 http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api.

如果您尝试创建一个新用户,为什么要给它一个 ID?您必须发布用户名、姓氏、电子邮件等数据,并让后端为这个新资源生成一个 ID(如自动递增的 id 或某些 UUUID)。

例如,在我的应用程序中,我使用 json 正文进行 POST 请求,如下所示:

  {
    "loginId":    "ravi.sharma",
    "firstName":  "Ravi",
    "lastName":   "Sharma",
    "email":      "myemail@email.com",
    "contactNo":  "919100000001",
    "..." : ".."
  }

此外,您的响应应该在成功创建后返回 HTTP-201,并且它应该包含一个位置标头,指向新创建的资源。

【讨论】:

  • 感谢您的回复,但规范隐含地表示使用 PUT 进行创建。此外,它需要返回一个我已经硬编码为静态变量的预定义 JSON。
  • @Flopn 如果您使用 PUT 创建新资源,那么您就隐含地允许客户端拥有 URI 空间。随着时间的推移,这可能会成为问题,特别是如果您想以某种方式修改 URI 结构,这就是为什么 POST 是创建新资源的最佳操作的原因。您确定要使用 PUT 而不是质疑规范吗?
【解决方案2】:

使用具有成员变量名称和类型的类而不是使用字符串主体。

public class User {
    private String name;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

(这适用于开箱即用的 Spring Boot Web。如果是 Spring MVC,您可能需要添加 Jackson 依赖项):在您的 Controller 上,添加 @RequestBody 注释,然后 Jackson 将负责取消编组JSON 字符串到用户对象。

public String createUser(@PathParam("id") int id, @RequestBody User user){

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2017-01-19
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多