Вопрос по forms, html, post-redirect-get, php, session – Понимание «post / redirect / get» [закрыто]

20

Мне очень трудно понять точный процесс & quot; post / redirect / get & quot ;. Я пролистал этот сайт и Интернет в течение нескольких часов и не могу найти ничего, кроме "здесь" концепции ". Это так просто, что не требует пошагового руководства? Кто-нибудь знает хороший сайт или книгу, которую я мог бы использовать, чтобы найти пример или учебник?

У вас был конкретный вопрос по этому поводу? На самом деле все довольно просто, если вы немного его используете, вы можете в него углубиться, если хотите.This description выглядит довольно хорошо. Christian Varga
Если вам нужны чистые URL-адреса (без лишних параметров get), вы можете использовать шаблон Post / Redirect / Cookie или шаблон Post / Redirect / Session. Идея та же, но вы используете cookie или сеанс для хранения и извлечения параметров. ADTC
О, нет, это не применимо. Я не прочитал вопрос должным образом (к счастью, я не ответил на него). Christian Varga
@ChristianVarga Это правильная ссылка? На первый взгляд, похоже, что эта статья неPRG. Wiseguy
Привет. Вы подразумеваете & quot; Опубликовать / Перенаправить / Получить & quot; шаблон дизайна веб-разработки, который предотвращает дублирование представления формы? verisimilitude

Ваш Ответ

3   ответа
18

Как вы знаете из вашегоисследование, POST-redirect-GET выглядит так:

The client gets a page with a form. The form POSTs to the server. The server performs the action, and then redirects to another page. The client follows the redirect.

Например, скажем, у нас есть такая структура сайта:

/posts (shows a list of posts and a link to "add post") /<id> (view a particular post) /create (if requested with the GET method, returns a form posting to itself; if it's a POST request, creates the post and redirects to the /<id> endpoint)

/posts сам по себе не имеет отношения к этому конкретному шаблону, поэтому я его опущу.

/posts/<id> может быть реализовано так:

Find the post with that ID in the database. Render a template with the content of that post.

/posts/create может быть реализовано так:

If the request is a GET request: Show an empty form with the target set to itself and the method set to POST. If the request is a POST request: Validate the fields. If there are invalid fields, show the form again with errors indicated. Otherwise, if all fields are valid: Add the post to the database. Redirect to /posts/<id> (where <id> is returned from the call to the database)
Я слышал, что всегда лучше использовать POST вместо GET ??? whatdafrak
@whatdafrak: страницы поиска ничего не изменяют, так что, вероятно, было бы разумнееGET запрос (если в запросе нет тонны данных, в этом случае он становится более сложным).
@whatdafrak: не всегда.POST используется для действий, которые изменяют вещи.GET используется для страниц, которые просто отображают информацию, но не изменяют какую-либо информацию.
Я довольно новичок в php и сессиях, так что мне было тяжело с этим примером. Все, что я пытаюсь сделать, это запретить браузеру отображать сообщение «ошибка повторной отправки». когда я вернусь к своим результатам поиска. Пользователь ищет базу данных, используя форму. Следующая страница запрашивает базу данных, используя информацию о пользователях, и они могут щелкнуть по результату, и он перенесет их на третью страницу, которая использует идентификатор результата в переменной сеанса для загрузки информации для этого результата. Но когда я возвращаюсь на страницу результатов, я получаю сообщение об ошибке, и все в Интернете говорит, что мне нужно сделать эту вещь перенаправления, а я просто не получаю ее whatdafrak
Я попробовал метод GET, и он делает именно то, что я хочу, и теперь я понимаю, что GET не следует использовать с конфиденциальной информацией, так что это подходит для моих целей. Благодарю. Я все еще расстроен, потому что я не понимаю, как использовать метод PRG, но, возможно, я забегаю вперед. Я полагаю, что я перейду этот мост, если / когда я туда доберусь, и надеюсь, что у меня будет намного лучшее понимание того, что я делаю. Е.Д .: «Делая именно то, что я хочу», я могу вернуться и не получить «повторно». ошибка. whatdafrak
39

Википедия объясняет этоso Что ж!

The Problem

The Problem

The Solution

The Solution

Скажите мне что-нибудь, что происходит, когда пользователь обновляет или нажимает кнопку "отправить"? еще раз до того, как ответ сервера 3xx достигнет его?
Ну, эта графика даже более ясна, чем чтение тонны текста.
Вместо того, чтобы публиковать фотографии из Википедии, я думаю, что было бы лучше напрямую связываться с Википедией, не так ли?
@Vaibhav Да, это то, что паттерн PRG не может решить, вы действительно получите дублированные посты. Если вы столкнулись с этой проблемой, см.this для дополнительной информации. Я бы использовал опцию вthis answer от rogueleaderr.
@ erikb85 Я уже сделал, посмотрите наверх.
5

Я попытаюсь объяснить это. Может быть, другая точка зрения помогает тебе.

С PRG браузер в итоге делает два запроса. Первый запрос является запросом POST и обычно используется для изменения данных. Сервер отвечает с заголовком Location в ответе и без HTML в теле. Это приводит к тому, что браузер будет перенаправлен на новый URL. Затем браузер отправляет запрос GET на новый URL, который отвечает HTML-контентом, который отображает браузер.

Я попытаюсь объяснить, почему следует использовать PRG. Метод GET никогда не должен изменять данные. Когда пользователь щелкает ссылку, браузер или прокси-сервер может вернуть кэшированный ответ и не отправлять запрос на сервер; это означает, что данные не были изменены, когда вы хотели, чтобы они были изменены. Кроме того, запрос POST не должен использоваться для возврата данных, потому что, если пользователь хочет просто получить свежую копию данных, он вынужден повторно выполнить запрос, что заставит сервер снова изменить данные. Вот почему браузер выдаст вам смутное диалоговое окно с вопросом, уверены ли вы, что хотите повторно отправить запрос и, возможно, изменить данные во второй раз или отправить электронное письмо во второй раз.

PRG - это комбинация POST и GET, которая использует каждый для того, для чего он предназначен.

Я думаю, что я понимаю концепцию, но не исполнение. У меня есть search.php, который принимает входные данные из формы и использует POST для отправки его в results.php, который принимает входные данные и запрашивает их в базе данных. Я изменил свою форму POST на страницу перенаправления, которая работает и перенаправляет на страницу results.php. Но что мне нужно изменить в моем файле results.php, чтобы получить переменные, которые я передавал с помощью POST? Как эти переменные передаются со страницы формы, через страницу перенаправления и на страницу результатов. И как я могу получить к ним доступ? whatdafrak
так на странице перенаправления мне нужно добавитьsession_start(); в моей странице перенаправления для передачи переменных? Нужно ли извлекать переменные со страницы формы на странице перенаправления с помощью$_POST или они просто автоматически остаются в живых? whatdafrak
У вас есть два варианта. 1. Используйте параметры запроса, добавленные к URL. 2. Сохраните данные в сеансе. 1 лучше, но иногда не практично. 2 проще, но вы можете создать беспорядок, если вы неосторожны и также используете больше памяти на сервере, чем вам нужно.

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