Имя: Пароль:
IT
Веб-мастеринг
Зачем нам Get-запрос при удалении сущности?
0 Steel_Wheel
 
31.08.12
13:19
Собственно, вопрос.
Делаю простой блог-хост. Есть список комментов, захотел прикрутить кнопку/гиперссылку удаления прямо в их списке. Приписал пост-метод на их удаление, а при переходе по ней, приложение выдает, что не найден GET-метод

Внимание, вопрос: зачем там get-метод, если все данные уже отображены в списке, а я пытаюсь заставить сервер сделать действие (это уже метод POST)?
1 Волшебник
 
31.08.12
13:22
GET - это через URL
POST - через форму, submit
2 Steel_Wheel
 
31.08.12
13:24
(1) Т.е. сделать кнопку -- правильнее (это как раз и есть submit-тег)
3 Steel_Wheel
 
31.08.12
13:26
Так, submit не тег. тег -- button.
Думаю, его и задействую, метод передачи сделаю POST
4 skunk
 
31.08.12
13:29
гет запрос оптправляет данные путем формирования урл ... то есть ... Зачем нам Get-запрос при удалении сущности? это типичный гет запрос ... в котором передаються два параметра ид - темы и алл - показывать все сообщения

урла была-бы http://www.forum.mista.ru/topic.php ... а параметры передались бы в самом хттп пакете ...

пост используют как правило для пердачи больших данных
5 skunk
 
31.08.12
13:30
в посте урла была-бы http://www.forum.mista.ru/topic.php ... а параметры передались бы в самом хттп пакете ...
6 Steel_Wheel
 
31.08.12
13:33
Ну у меня URL
simpleblog/details/22/deleteComment/15

simpleblog/details/ -- это контроллер темы (который принимает id темы)
deleteComment/15 -- это метод контроллера, который говорит, что надо удалить comment с id=15

как-то так. Проект дома, я на работе
7 skunk
 
31.08.12
13:34
у тебя судя по всему типичный гет
8 Steel_Wheel
 
31.08.12
15:03
А я могу гет-ом удалять из БД?
Код как бы есть, но может, ограничения какие-то есть?
9 BigHarry
 
31.08.12
20:22
(8) А какая разница, гетом или постом удалять? В обоих методах можно параметрами передать все необходимые данные для удаления из БД, подозреваю что это будет какой-то ID ключевой записи, для этого GET-а хватит....
10 Asmody
 
31.08.12
21:28
ну, вообще-то в спецификации протокола метод DELETE описан www.w3.org/Protocols/rfc2616/rfc2616-sec9, только в браузерах он не реализован.
Де-факто GET и POST различаются только способом передачи параметров
11 Steel_Wheel
 
31.08.12
22:49
(10) строка адреса  / где-то в запросе?
12 BigHarry
 
01.09.12
09:48
Собственно, через GET можно информацию не только в строке запроса передать, но еще и в заголовке,  через всякие там куки-шмуки и прочие служебные поля, но для передачи больших объемов информации на сервер задуман был как раз POST.
13 Torquader
 
01.09.12
22:12
Начнём с того, что браузер изначально умеет только два метода - GET или POST, которые пишутся в теге формы.
Соответственно, для удаления чего-либо нужно использовать метод POST, так как система кеширования считает POST-запросы значимыми и выдаёт предупреждение пользователю, если он пытается повторить POST запрос, а вместо GET запроса "умный" браузер вообще может передать вопрос об изменении страницы, если запрос с указанными параметрами уже был (не забываем, что в случае GET все параметры пишутся в адресной строке, то есть строке запроса).
Во-вторых, удаление из базы и запрос к Web-серверу никак не связаны, так как это разные действия над совершенно разными объектами - и нужно написать код, который при определённом POST-запросе будет вызывать команду удаления строки из базы данных сервера.
14 BigHarry
 
02.09.12
11:34
(13) Все это легко обрабатывается на сервере, нормальный браузер не будет кэшировать, если сервер ему в заголовке ответа выдаст соответствующие инструкции.
15 oleg_km
 
02.09.12
19:26
(14) ну на POST браузер по-любому выдаст предупреждение при нажатии кнопки обновления. Вообще-то в RFC расписаны все рекомендации по особенностям GET и POST
16 Steel_Wheel
 
05.09.12
12:05
(13) Такой код есть.

@Controller
@RequestMapping(value = "/topic")
public class TopicController {

   @Autowired
   private TopicService service;

   ...

   @RequestMapping(value = "/deleteComment/{commentId}", method = {RequestMethod.POST, RequestMethod.POST})
   public String deleteComment(@PathVariable int commentId, BindingResult result, Model model){

       Comment deletedComment = commentService.findCommentByID(commentId);
       if (deletedComment != null) {
           commentService.deleteComment(deletedComment);
       }

       return "refresh:";
  }

}

Два метода доступа гет/пост были добавлены из за следующего:

Я нарисовал кнопку
<form><button formaction = "../deleteComment/1" formmethod = "post">delete</button></form>
Потом нажал на нее, управление в метод контроллера не передалось. Тогда я переделал кнопку:
<form action="../deleteComment/1" method="post">
   <button>delete</button>
</form>
И снова нажал. Управление опять не передалось.

Тогда я добавил еще 2 такие же кнопки, но с методом GET. Опять не передается управление. Прикрутил гиперссылку, перешел по ней -- управление передано успешно.

Что бы я мог делать не так?