Почему операции HTTP должны быть идемпотентными, когда у нас есть TCP / IP? - PullRequest
2 голосов
/ 03 мая 2011

Зачем нам HTTP GET, PUT или DELETE, чтобы быть идемпотентными, если TCP / IP является надежным протоколом, который будет повторять запросы от нашего имени?

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

TCP / IP не повторяет запросов , он повторно передает исходные пакеты , которые составляют каждый запрос, если необходимо.

Если запрос терпит неудачу (на уровне HTTP), это задача клиента, чтобы повторить его, а не сетевой стек.

В частности, если клиент (по какой-либо причине) не получает код ответа, указывающий,успешная операция RESTful или нет, клиент должен иметь возможность повторно отправить ту же операцию, не беспокоясь о каких-либо непреднамеренных побочных эффектах.

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

2 голосов
/ 03 мая 2011

HTTP GET, PUT и DELETE являются идемпотентными, потому что в некоторых режимах сбоя сети клиент не может знать, завершен ли запрос или насколько полно.

Например, если клиент запрашивает УДАЛЕНИЕ ресурса, но сервер закрывает соединение до того, как клиент получит полный ответ, клиент не знает, был ли удален ресурс или нет.В этом случае у клиента возникает дилемма: возможно, операция завершилась неудачно, и в этом случае сообщение DELETE следует отправить повторно, чтобы перевести приложение в желаемое состояние.Но, возможно, это удалось;будет ли отправлять тот же запрос DELETE, если я попытаюсь повторить?Возможно, это сработает.Возможно, он вернет ошибку 500 (что только добавляет путанице клиента).Возможно, это будет относиться к другому ресурсу!Требование идемпотентности позволяет клиенту быть уверенным, что он может повторить запрос и заставить его работать.Это не значит, что вы получите точно такой же ответ;первый запрос может получить 200 OK, а второй 404 Not Found или 410 Gone.Но клиенту не нужно беспокоиться о непреднамеренных побочных эффектах от повторных попыток.

2 голосов
/ 03 мая 2011

Кажется, вы путаете идемпотентность на уровне протокола HTTP с надежностью потока байтов на уровне TCP.

Идемпотентность HTTP:

Идемпотент (википедия) означает, что отправка одного и того же HTTP-запроса 10 раз имеет тот же эффект, что и один раз.

Надежность TCP:

Если вы потеряете пакет в потоке TCP, он будет передан повторно.Но протокол приложения (HTTP) не знает, что TCP должен был повторно передавать пакеты.

Даже если отдельный пакет, содержащий полный запрос HTTP, повторно передается по TCP 10 раз, браузер / сервер увидит только один HTTPзапрос.Причина повторной передачи TCP заключается в потере пакетов, но прикладные протоколы (например, HTTP) не знают, что TCP должен был повторно передать.Они выглядят одинаково с потерей пакета или без него

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