Почему вы должны удалять, используя HTTP POST или DELETE, а не GET?

Если я работаю с элементами (в отличие от фоновых изображений CSS), я использую удобное обходное решение, комбинацию Modernizr (библиотека JavaScript, которая обнаруживает наличие определенных функций , например, поддержка .svg в браузерах) и несколько строк jQuery:

$(".no-svg img").each(function() {
    var $this = $(this);
    if ($this.attr("src").indexOf(".svg") > -1) {
        var isSvg = $this.attr("src").toString();
        var isPng = isSvg.replace(".svg", ".png");
        $this.attr("src", isPng);
    }
});

1) Я создаю .png версии каждого .svg-файла. 2) Modernizr предоставляет элементу html класс .no-svg, если он обнаруживает, что поддержка .svg отсутствует. 3) jQuery меняет местами расширения файлов. .indexOf(".svg") проверяет, содержится ли строка ".svg" в пределах значения src, возвращая -1, если она не находит его и положительное целое число, если оно выполняется. Если он найдет ".svg", вся цепочка src втягивается в isSvg, а .replace() свопы .svg для .png и сохраняет результат как isPng, который затем устанавливается как значение src.

31
задан Brian Tompsett - 汤莱恩 2 July 2015 в 18:30
поделиться

8 ответов

Ответ Джона Скита - канонический ответ. Но: Предположим, у вас есть ссылка:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

, и гугл-бот приходит и индексирует вашу страницу? Что происходит потом?

55
ответ дан 27 November 2019 в 19:41
поделиться

GET обычно не имеет побочных эффектов - другими словами, он не меняет состояние. Это означает, что результаты могут кэшироваться, закладки могут создаваться безопасно и т. Д.

С разработчикам HTTP 1.1 RFC 2616

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

В частности, конвенция была Установлено, что ПОЛУЧИТЬ и ГОЛОВУ методы не должны иметь Важность принятия действий других чем поиск. Эти методы должны считаться "безопасным". Это позволяет пользователю агенты для представления других методов, такие как POST, PUT и DELETE, в особый способ, так что пользователь сделан осознавая тот факт, что возможно запрашивается небезопасное действие.

Естественно, невозможно убедитесь, что сервер не генерировать побочные эффекты в результате выполнение запроса GET; на самом деле, некоторые динамические ресурсы считают, что характерная черта. Важное различие вот что пользователь не запрашивал побочные эффекты, поэтому не могут нести ответственность за них.

50
ответ дан 27 November 2019 в 19:41
поделиться

Помимо пуристических проблем, связанных с идемпотентностью, есть практическая сторона: пауки / боты / сканеры и т. д. будут следовать гиперссылкам. Если у вас есть действие «удалить» как гиперссылка, которая выполняет GET, то Google может весело удалить все ваши данные. См. « Паук Судьбы ».

С постами это не риск.

17
ответ дан 27 November 2019 в 19:41
поделиться

Пожалуйста, смотрите мой ответ здесь . Это в равной степени относится и к этому вопросу.

  • Предварительная выборка: Многие веб-браузеры будут использовать предварительную выборку. Что значит что он загрузит страницу перед вами нажмите на ссылку. Предвидя, что Вы перейдете по этой ссылке позже.
  • Боты: Есть несколько ботов, которые сканируют и индексируют интернет для Информация. Они будут только выпускать GET Запросы. Вы не хотите удалять что-то из запроса GET для этого причина.
  • Кэширование: Запросы GET HTTP не должны изменять состояние, и они должны быть идемпотентными. Идемпотент означает, что выдача запроса один раз или выдача его несколько раз дает один и тот же результат. Т.е. побочных эффектов нет. Для По этой причине GET HTTP-запросы тесно связаны с кэшированием.
  • Стандарт HTTP говорит так : Стандарт HTTP говорит, что каждый метод HTTP для. Несколько программ построены для использовать стандарт HTTP, и они предполагают, что вы будете использовать его таким, какой вы есть должен. Так у вас будет неопределенное поведение от убийства случайные программы, если вы не подписаны.
12
ответ дан 27 November 2019 в 19:41
поделиться

В дополнение к паукам и запросы должны быть идемпотентными, есть также проблема безопасности с запросами get. Кто-то может легко отправить вашим пользователям электронное письмо с

<img src="http://yoursite/Delete/Me" />

в тексте, и браузер с радостью согласится и попытается получить доступ к ресурсу. Использование POST не является лекарством от таких вещей (поскольку вы можете довольно легко собрать пост в javascript), но это хорошее начало.

4
ответ дан 27 November 2019 в 19:41
поделиться

Об этой теме (использование методов HTTP), я рекомендую прочитать эту запись в блоге: http://blog.codevader.com / 2008/11/02 / why-learning-http-do-question /

Это на самом деле противоположная проблема: почему не использовать POST, если данные не изменены.

3
ответ дан 27 November 2019 в 19:41
поделиться

Допустим, у нас есть приложение для интернет-банкинга, и мы заходим на страницу перевода. Зарегистрированный пользователь решает перевести 10 долларов на другую учетную запись.

Нажатие на кнопку отправки перенаправляет (как запрос GET) на https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

Но интернет-соединение медленное и / или сервер (ы) занят (ы), поэтому после нажатия кнопки отправки новая страница загружается медленно.

Пользователь расстроен и начинает яростно нажимать F5 (обновить страницу). Угадай, что будет? Может произойти больше чем одна передача, возможно, опустошая учетную запись пользователя.


Теперь, если запрос сделан как POST (или что-то еще, кроме GET), первая F5 (страница обновления), которую пользователь заставит браузер, мягко спросит " ты уверен, что хочешь это сделать? Может иметь побочные эффекты [бла бла бла] ... "

2
ответ дан 27 November 2019 в 19:41
поделиться

Другая проблема с GET заключается в том, что команда переходит в адресную строку браузера. Поэтому, если вы обновляете страницу, вы снова вводите команду, будь то «удалить последний материал», «отправить заказ» или подобное.

1
ответ дан 27 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: