当您有多个方法调用但请求主体不同时,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 更新,您可以考虑上面的端点,并从路径变量中获取您的 userloginid
和 propertyid
。
在 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 来处理输出和输入情况。
有人告诉我,在构建 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 更新,您可以考虑上面的端点,并从路径变量中获取您的 userloginid
和 propertyid
。
在 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 来处理输出和输入情况。