что должно быть возвращено для запроса http put, если id не существует? - PullRequest
0 голосов
/ 18 января 2020

Я создаю спокойный веб-сервис. Для запроса put я сначала нахожу testBean с идентификатором в переменной path. Если его не существует, то я создаю новый. Мне интересно, если это правильно, чтобы создать новый здесь, или я должен выбросить исключение. Поскольку id - это автоинкремент, если я создаю новый TestBean, идентификатор, сохраненный в БД, отличается от идентификатора из параметра пути URL.

@PutMapping("/Test/{id}")
   public TestBean updateTestBean(@PathVariable long id, @RequestBody TestBean newTestBean) {
      return testBeanService.getTestById(id)
         .map(testBean -> {
            testBean.setBRR(newTestBean.getBRR());
            testBean.setModifiedDate(newTestBean.getModifiedDate());
            return crewsBeanService.saveTestBean(testBean);
         })
         .orElseGet(() -> {
            newTestBean.setId(id);
            return testBeanService.saveTestBean(newTestBean);
         });
   }

Ответы [ 5 ]

1 голос
/ 18 января 2020

Я всегда предпочел бы сохранить метод PUT идемпотентным. Идемпотентность можно объяснить тем, что сколько раз вы примените определенную «операцию», результат будет таким же, как в первый раз. Поскольку REST - это просто стиль, это зависит от вас, но я всегда буду спрашивать меня, имеет ли смысл сохранять операцию как PUT или POST.

Что делать, если клиент вашей службы нетерпелив и имеет доступ к вашей услуге PUT несколько раз во время обработки первого запроса ?. Вы можете создать двух пользователей. Таким образом, исключение имеет смысл, если идентификатор не существует .

Это может быть 400 или 404, Я не предпочитаю 404 , но предпочитаю 400 по следующим причинам:

1) Это сбивает с толку клиента ваших API, если неверный ресурс или неправильный идентификатор, который они используют.
(Вы всегда можете различить свой ответ об ошибке и предоставить значимую информацию, но все же я не предпочитаю!)

2) Используя 404,

вы говорите пользователю, что проблема может быть постоянной или временной

, например, скажем, что ваша служба неправильно зарегистрирована на сервере обнаружения (eureka) или если происходит сбой, сервер обнаружения будет отправлять 404, пока вы не исправите проблему.

Используя 400,

вы просите пользователя попробовать другой ввод, в данном случае с другим идентификатором. Это постоянно ...

, так как вы сказали, что id - автоинкремент, и клиент не может определить значение, так что пока пользователь не решит проблему, вернувшись назад и запросив у службы POST новый идентификатор запрос "ПЛОХО" и не может быть обработан.

0 голосов
/ 22 января 2020

Если Request-URI не указывает на существующий ресурс и этот URI может быть определен запрашивающим пользовательским агентом как новый ресурс, исходный сервер может создать ресурс с этим URI.

Если сервер желает, чтобы запрос был применен к другому URI, он ДОЛЖЕН послать ответ 301 (перемещен постоянно); Пользовательский агент МОЖЕТ затем принять собственное решение относительно того, следует ли перенаправить запрос.

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

0 голосов
/ 18 января 2020

PUT должен отвечать только за обновление записи. Если идентификатор вашего бина не существует, у вас будет исключение на уровне персистентности. Вы можете перехватить это исключение в своем API и вернуть один из кодов ответа 400, например, BAD REQUEST.

Для создания следует использовать POST, в этом случае не следует указывать идентификатор

Это был бы ОТЛИЧНЫЙ способ сделать это.

0 голосов
/ 18 января 2020

404 - это правильный код возврата для PUT несуществующего ресурса, поскольку используемый URL-адрес не обращается к существующему ресурсу.

0 голосов
/ 18 января 2020

Основываясь на принципе единой ответственности, у вас должны быть методы, которые делают только одно. Поэтому для вашего вопроса вам нужно 2 метода для каждого запроса:

GET - запросить у сервера объект, в вашем случае TestBean.

POST - сохранить новые объекты (для них вам не нужен идентификатор).

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

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