Повторное использование одного и того же объекта домена в 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);
}
Другие вопросы по тегам