Повторное использование одного и того же объекта домена в For Get и POST
Предполагая, что у меня есть студент Объект
public class Student{
private long id;
private string name;
private List<string> courses
}
В типичном запросе Get, чтобы получить студента, я отправляю объект Student клиенту.
В случае запроса PUT на изменение объекта Student путем добавления или удаления курса или POST-запроса для создания записи Student мне нужно только получить от клиента student.id и список курсов.
У меня вопрос: могу ли я отправить тот же объект Student от клиента в запросе PUT или POST без указания имени или, возможно, иметь name = null? Или я должен создать отдельный объект домена, который будет отправлен клиентом, например:
public class StudentReponse
{
private long id;
private List<string> courses;
}
Я предполагаю, что мой общий вопрос заключается в том, должны ли мы разделять объекты запроса и ответа в Rest API? или для повторного использования кода попробуйте использовать одни и те же доменные объекты для обоих направлений?
1 ответ
мы должны отделить объекты Request и response в Rest API?
Да - это позволяет независимо развивать запрос и ответ. Если вы соблюдаете правила REST при создании, вы должны вернуть 201 - created
и идентификатор вновь созданного объекта.
Если клиенту требуются подробности об этом, клиент может использовать ID + GET, чтобы получить полное представление ресурса.
Также рассмотрите возможность не выставлять доменные объекты напрямую через REST. Например, наличие объекта сущности домена - у него, вероятно, будут некоторые поля, связанные со слоем персистентности, такие как идентификатор базы данных, createOn, creationBy и т. Д. Эти поля не следует отправлять клиенту. Используйте простое представление StudentDto (StudentResponse, StudentResponseDtoto, как вы хотите это называть), которое содержит только те поля, которые представляют интерес для клиента.
Хранение предметных областей и объектов ответов также позволяет вам развивать их отдельно или изменять представление данных. Представьте, что у вас есть объект JPA, и вы используете аннотации JPA и Джексона в одном классе - это очень грязно, трудно читать и поддерживать.
Обновить:
Если вы используете тот же объект, который будет изменен клиентом и отправлен обратно на сервер, я думаю, вы можете использовать его повторно и смоделировать его следующим образом:
получить
@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);
}