Использование GET для неидемпотентного запроса - PullRequest
3 голосов
/ 28 декабря 2011

Проще говоря, у меня есть веб-сайт, на котором вы можете зарегистрироваться как пользователь и добавить данные.В настоящее время имеет смысл добавлять определенные данные только один раз, поэтому добавление должно быть идемпотентным, но теоретически вы можете добавлять одни и те же данные несколько раз.Я не буду вдаваться в подробности.

Согласно RFC 2616 , запросы GET должны быть идемпотентными (действительно нуль-потентными).Я хочу, чтобы пользователи могли делать что-то вроде посещения

http://example.com/<username>/add/?data=1

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

Существует ли какой-либо технически правильный способ, позволяющий пользователям добавлять данные, используя только GET (например, посещая ссылку вручную или позволяя внешним веб-сайтам использоватьссылка на сайт).Когда они посещают эту страницу, я мог сделать свой собственный запрос POST / PUT либо с помощью javascript, либо с cURL, но это все еще нарушает дух идемпотентных запросов GET.

1 Ответ

4 голосов
/ 28 декабря 2011

Существует ли какой-то технически правильный способ, позволяющий пользователям добавлять данные, используя только GET ...?

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

См. Также: Почему данные не следует изменять по запросу HTTP GET?

Что касается невозможности PUT из браузера, для этого есть обходные пути [1] , [2] , большинство из которых используютPOST, но также передает своего рода параметр запроса _method, который перехватывается сервером и направляет к соответствующему действию на стороне сервера.

...