Реализовать статус 200 при отправке DELETE - PullRequest
0 голосов
/ 30 января 2019

Я хочу реализовать запрос DELETE с помощью Spring Boot.Я пробовал это:

@DeleteMapping("remove/{id}")
    public ResponseEntity<?> remove(@PathVariable String id) {
        return ResponseEntity.ok(transactionNotesService.delete(Long.valueOf(id)))
                .orElseGet(() -> notFound().build());
    }

Но я получаю The method ok(T) in the type ResponseEntity is not applicable for the arguments (void).

Как я могу изменить код для возврата кода 200 при выполнении УДАЛИТЬ?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

В вашем случае вы, вероятно, могли бы вернуть 200 или 204 (202 для асинхронного / в процессе удаления), как указано в документации MDN :

Если метод DELETEуспешно применяется, возможны несколько кодов состояния ответа:

Код состояния 202 (Принят), если действие, скорее всего, будет успешным, но еще не введено в действие.

A 204 (Нет содержимого)код состояния, если действие было выполнено, и дополнительная информация не указывается.

200 (ОК) код состояния, если действие было выполнено, и ответное сообщение включает в себя представление, описывающее состояние.

Для 204, что вы хотите:

return ResponseEntity.noContent().build();

Для 200, что вы хотите, например:

return ResponseEntity.ok("Entity deleted");

Кодизменить на возврат 204

В вашем фактическом коде часть orElseGet() не должна компилироваться, поскольку ok() не возвращает Optional.
Для обработки случая идентификаторапройденный клиентом не имеет соответствияс любой существующей сущностью вы можете перехватить EmptyResultDataAccessException (подкласс RuntimeException), который выдается JpaRepository.deleteById().
Например:

@DeleteMapping("remove/{id}")
public ResponseEntity<?> remove(@PathVariable String id) {
  try{
    transactionNotesService.delete(Long.valueOf(id)); 
    return ResponseEntity.noContent().build();        
   }
   catch (EmptyResultDataAccessException e){
      return ResponseEntity.notFound().build();
  }                                
 }
0 голосов
/ 30 января 2019

Вы также можете избежать ненужных действий Long.valueOf(id)

Spring может автоматически разобрать его:

public ResponseEntity<?> remove(@PathVariable Long id)

0 голосов
/ 30 января 2019

Проблема здесь в том, что вы путаете ResponseEntity.ok () и ResponseEntity.ok (T t), где t - это то, что вы хотите вернуть.

Если транзакцияNotesService.delete или notFound (). BuildЕсли в качестве возвращаемого типа есть void, вы не можете использовать их в качестве возвращаемого значения, поскольку они не имеют значения.Я предполагаю, что вы имели в виду что-то вроде этого:

@DeleteMapping("remove/{id}")
public ResponseEntity<?> remove(@PathVariable String id) {
    transactionNotesService.delete(Long.valueOf(id));
    return ResponseEntity.noContent();
}
0 голосов
/ 30 января 2019

Согласно спецификации HTTP у вас всегда должно быть тело со статусом 200.

10.2.1 200 OK

Запрос успешно выполнен.Информация, возвращаемая с ответом, зависит от метода, используемого в запросе, например:

GET в ответе отправляется объект, соответствующий запрошенному ресурсу;

HEAD заголовок объектаполя, соответствующие запрашиваемому ресурсу, отправляются в ответе без какого-либо тела сообщения;

POST - объект, описывающий или содержащий результат действия;

TRACE - объект, содержащий сообщение запроса, как получено.конечным сервером.

Вместо этого следует использовать статус 204 (без содержимого), который не принимает аргумент тела.

10.2.5 204 Нет содержимого

Сервер выполнил запрос, но ему не нужно возвращать тело объекта, и он может захотеть вернуть обновленную метаинформацию.Ответ МОЖЕТ включать новую или обновленную метаинформацию в форме заголовков объекта, которые, если они присутствуют, ДОЛЖНЫ быть связаны с запрошенным вариантом.

Если клиент является агентом пользователя, он НЕ ДОЛЖЕН изменять свое представление документа с этогочто вызвало отправку запроса.Этот ответ в первую очередь предназначен для того, чтобы ввод данных для действий происходил без изменения вида активного документа агента пользователя, хотя любую новую или обновленную метаинформацию СЛЕДУЕТ применять к документу, который в данный момент находится в активном представлении агента пользователя.

Ответ 204 НЕ ДОЛЖЕН включать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.

transactionNotesService.delete(Long.valueOf(id));
return ResponseEntity.noContent().build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...