Правильно ли использовать «GET» как метод для изменения данных в REST API - PullRequest
0 голосов
/ 02 апреля 2019

Я создаю небольшое приложение для целей двойного согласия, пользователь должен щелкнуть ссылку в электронном письме, но это отправляет запрос GET HTTP в мой REST API. Но логический запрос REST API с GET приводит к получению данных вместо установки данных.

Я пытался использовать

<form method="post" action="x.x.x.x/api/optin/double/"></form> 

элемент для установки метода в POST и создания элемента ввода:

<input name="method" value="put" style="display:none">

для "установки метода по параметру. Но это не похоже на правильное решение.

Я мог бы создать для этой цели файл ("acceptdooubleoptin.php"), но я не уверен, что это правильное решение. Или я полностью скучаю по пониманию цели ОТДЫХА?

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

GET - это совершенно приемлемый способ достичь того, чего вы пытаетесь достичь.

Нет ничего плохого в том, чтобы хотеть использовать ваши глаголы GET / POST / PATCH / DELETE в их самом буквальном смысле, но это один из случаев, когда технология (то есть современные почтовые клиенты) все, но принимает решение за вас. И в этом нет ничего плохого.

См. короткий пост из Campaign Monitor , объясняющий, как он выглядит, когда вы пытаетесь сгенерировать запрос POST в электронном письме. Короче говоря, почтовый клиент пользователя получает в лучшем случае .

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

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

1 голос
/ 02 апреля 2019

Правильно ли использовать «GET» в качестве метода изменения данных в REST API

Важно понимать, что в стандартном значении GET есть safe семантика.Вот как Филдинг описал этот вопрос в 2002 году .

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

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

Для варианта использования, такого как «Opt In», вы действительнонужно думать о том, какие обязательства вы несете, если эта ссылка получена без явного согласия человека.

Правильный способ сделать это - использовать небезопасный запрос (например, POST).

Тем не менее, реализация «Правильно» может существенно повлиять на вашу скорость принятия;бизнес может предпочесть принять ответственность, а не потерять возможности.

1 голос
/ 02 апреля 2019
  1. Нет практического способа получить ссылку в сообщении электронной почты, содержащуюся в запросе POST.Лучшее, что вы можете сделать, это отправить их на страницу, которая отображает кнопки, которые они должны нажать, который генерирует * запрос * 1004, но это спорный вопрос, будете ли вы хотите этот поток для пользователя, в отличие от одного щелчка мыши в своей электронной почте.

  2. Запрос в основном идемпотент , т. Е. Даже если пользователь нажимает несколько раз, он все равно приводит к тому, что он просто находится в включенном состоянии, поэтому состояние не будет неоднократно изменяется (в отличие от нового сообщения, генерируемого каждый раз, когда вы, например, POST - /blog/posts).

В заключение, все в порядке,просто используйте запрос GET.

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