Правильное использование DTO в веб-сервисе Restful - PullRequest
0 голосов
/ 28 мая 2019

Я разрабатываю спокойный веб-сервис с использованием Spring Framework.У меня есть несколько вопросов о том, как правильно использовать DTO в моем проекте.

Прежде всего, я видел много примеров кода по использованию DTO, и всегда есть однозначное сопоставление с сущностями.Для User сущности у нас есть UserDto, для Country у нас есть CountryDto и т. Д. Я думаю, что это совсем не гибко.Для каждого сервиса мне нужны два DTO для ввода и вывода.это нормально?

Если я определю два DTO для каждой службы, могу ли я назвать их суффиксами запроса и ответа?Например, для службы createUser у меня есть два объекта DTO с именами CreateUserRequest и CreateUserResponse.

Некоторые сервисы не имеют выходов (только код состояния) или входов (просто Id в URL).Должен ли я определить пустой DTO для них или нет?Если я не определяю DTO в этих сценариях, это немного сбивает с толку, потому что иногда вы определяете два DTO для обслуживания, а иногда только один.

Должен ли я также отображать переменные пути, например /users/{id}, в объекты DTO?например вместо:

@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") Long id)

сделать что-то вроде:

@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") GetUserRequest request)

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

В идеальном полноценном веб-сервисе вы управляете ресурсами с помощью свойств, а не структур запроса-ответа.Итак, если вы создаете User, то можно принять и вернуть тот же DTO, и метод выглядит следующим образом:

@PostMapping("/")
public ResponseEntity<User> addUser(@RequestBody User user)

Использование тела запроса для GET технически возможно, но де-факто устарело, используйте путьпеременные и параметры запроса.

Некоторые сервисы не имеют выходов (только код состояния) или входов (просто Id в URL).Должен ли я определить пустой DTO для них или нет?

Нет, вы не должны определять DTO для объектов, которых у вас нет.

И последняя деталь: если у вас есть несколькометоды, манипулирующие одним и тем же ресурсом (например, пользователем), не создают несколько пользовательских DTO для получения, публикации и т. д.

0 голосов
/ 28 мая 2019

Следуйте этой схеме:

@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getUser(@PathVariable long id) {
        ResponseEntity<User> response = null;
        try {
            User user = userService.getUser(id);
            response = new ResponseEntity<User>(user, HttpStatus.OK);
        } catch (ApplicationException ex) {
            response = new ResponseEntity<User>(HttpStatus.NOT_FOUND);
        }
        return response;
    }

Не создавайте URL, как это: /users/{id}

Создайте такой URL-адрес - /{id} - это даст больше абстракции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...