当您有多个方法调用但请求主体不同时,DTO 模式是什么?

What is the DTO pattern when you have multiple method calls but different request bodies?

有人告诉我,在构建 RestFul API 时,请使用名词而不是动词。我还被告知每个 DTO 都有自己的控制器。如果 "edit property" 和 "add property" 方法需要两个不同的请求主体,我的 DTO 会是什么样子?

@RestController
@RequestMapping(value = "/property")
public class PropertyController{

    @RequestMapping(method = RequestMethod.GET)
    //get properties method definition goes here

    @RequestMapping(method = RequestMethod.PUT)
    // edit property method definition goes here

    @RequestMapping(method = RequestMethod.POST)
    // add property method definition goes here
}

编辑 属性 要求:

{
    "userloginid": "3333",
    "propertyname": "My edited property name",
    "propertyid": "1"
}

添加 属性 要求:

{
    "userloginid": "3333",
    "propertyname": "My new property name"
}

根据您的 json 数据,您的 DTO 可能是

PropertyDTO{
    long userloginid;
    String propertyname;
    long propertyid;
}

所以你的 API 看起来像

@RestController
@RequestMapping(value = "/property")
public class PropertyController{

    @RequestMapping(method = RequestMethod.GET)
    public PropertyDTO get(){
        return null;
    }

    @RequestMapping(method = RequestMethod.PUT)
    public Boolean update(@RequestBody PropertyDTO dto){
        return true;
    }

    @RequestMapping(method = RequestMethod.POST)
    public Boolean insert(@RequestBody PropertyDTO dto){
        return true;
    }
}

您应该使用这三个属性创建相同的 DTO (userloginid, propertyname, propertyid)。但是你要考虑到propertyid可以是null。然后当请求参数被发送时,如果propertyid没有被发送,解析器将创建一个DTO实例propertyid=null;否则解析器将使用 propertyid=value_passed_in 参数 .

创建一个 DTO 实例

/users/{loginid}/properties/{propertyid} - 请考虑这个端点,因为它更 RESTful

对于 PUT 更新,您可以考虑上面的端点,并从路径变量中获取您的 userloginidpropertyid

在 PUT 请求中 PUT /users/3333/properties/1 我将发送以下请求正文:

{
    "propertyname": "My edited property name"
}

对于创建新 属性 的 POST 请求,我会考虑向此 URL /users/{loginid}/properties/ 发送具有相同请求主体结构的请求:

{
    "propertyname": "My new property name"
}

如您所见,我没有在 POST 请求中发送任何 ID,因为存储对象的 ID 生成应该在 DAO 中进行。

客户端将在响应正文中收到 created/updated 属性 的 ID:

{
    "propertyname": "My updated/created property name",
    "propertyid": "1"
}

所以根据上面的示例,我将创建两个 DTO 来处理输出和输入情况。