RESTful put id和body

4

我需要让我的Java服务器接收PUT请求,以创建新用户。请求需要包含id和json格式的主体。URI地址应该是:

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

鉴于我已经创建了一个简单的Java类,可以使用Jackson将JSON转换为POJO,下面是我的问题:

如何指定PUT请求接受id和JSON body作为参数?到目前为止,我已经写出了:

 @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) - Tibrogargan
这是我尝试的第一件事,但每次执行查询时都会出现“资源不可用”的错误。 - Flopn
听起来更像是库的问题而不是你的代码,但我猜测 - 抱歉。 - Tibrogargan
你确定要让用户定义ID吗? 我建议使用“POST”和数据库生成的ID。 - cassiomolin
生成方法在这个阶段是无关紧要的,这只是一项大学作业。 - Flopn
2个回答

1
根据REST API约定,需要在像/usermanagement/users这样的uri上使用POST方法。PUT方法用于更新现有资源。您可以阅读这篇精彩的文章,了解如何设计实用的RESTful API。http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
如果要创建新用户,为什么要给它一个ID?您必须POST数据,例如用户名、姓氏、电子邮件等,并让后端为此新资源生成一个ID(如自动递增的ID或某些UUUID)。
例如,在我的应用中,我使用以下json主体进行POST请求:
  {
    "loginId":    "ravi.sharma",
    "firstName":  "Ravi",
    "lastName":   "Sharma",
    "email":      "myemail@email.com",
    "contactNo":  "919100000001",
    "..." : ".."
  }

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

感谢您的回复,但规范隐含地指出要使用PUT进行创建。此外,它需要返回预定义的JSON格式,我已经硬编码为静态变量。 - Flopn
@Flopn 如果您使用PUT来创建新资源,那么您会隐式地允许客户拥有URI空间。随着时间的推移,这可能会变得棘手,特别是如果您想以某种方式修改URI结构,这就是为什么POST是创建新资源的最佳操作的原因。您确定要使用PUT而不是询问规范吗? - sisyphus

0

不要使用字符串body,而是使用一个带有成员变量名称和类型的类,像这样。

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依赖项):在您的控制器上,添加@RequestBody注释,然后Jackson将负责将JSON字符串转换为用户对象。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接