在Get和POST中重用相同的域对象

时间:2018-04-04 17:59:12

标签: json rest domain-object

假设我有一个学生对象

public class Student{
private long id;
private string name;
private List<string> courses
}

在典型的Get请求中,为了获得学生,我将Student对象发送给客户。

如果PUT请求通过添加或删除课程或POST请求来修改学生对象来创建学生记录,我只需要从客户端接收student.id和课程列表。< / p>

我的问题是,我可以在PUT或POST请求中从客户端发送回相同的Student对象而不包含名称或者名称= null吗? 或者我应该创建一个由客户端发送的单独域对象,例如:

    public class StudentReponse
{
       private long id;
       private List<string> courses;
}

我想我的通用问题是,我们应该在Rest API中分离请求和响应对象吗?或者代码重用性尝试在两个方向上使用相同的域对象?

1 个答案:

答案 0 :(得分:0)

  

我们应该在Rest API中分离请求和响应对象吗?

是 - 它允许独立地发展请求和响应。 如果在发出create时遵循REST实践,则应返回201 - created和新创建的对象的ID。

如果客户端需要有关它的详细信息,客户端可以使用ID + GET来获取完整的资源表示。

还要考虑不直接通过REST公开域对象。 例如,有一个域实体对象 - 它可能有一些与持久层相关的字段,如数据库ID,createdOn,createdBy等。这些字段不应该发送到客户端。使用简单的StudentDto(StudentResponse,StudentResponseDto,无论你想要什么称呼)表示,它只包含客户感兴趣的那些字段。

保持域和响应对象分离也使您能够单独进化它们或更改数据表示。 想象一下,你有一个JPA实体,你在同一个班级同时使用JPA和Jackson注释 - 它非常混乱,难以阅读和维护。

<强>更新

如果您使用同一个对象进行客户端修改并发送回服务器,我想您可以重复使用它并将其建模为:

获取

@GetMapping("/student/{id}")
public StudentDto getStudent(@PathVariable long id) {
    return studentService.get(id);
}

<强>更新

@PutMapping("/student/{id}/update")
public ResponseEntity updateStudent(@PathVariable long id, @RequestBody StudentDto student) {
    return new ResponseEntity(studentService.updateStudent(id, student), HttpStatus.OK);
}