Отправить несколько ответов через один http.ResponseWriter - PullRequest
0 голосов
/ 25 сентября 2018

после того, как я нажму на кнопку «Опубликовать» в веб-интерфейсе, я получу данные в свой обработчик, создаю электронное письмо и отправлю его, но я хочу проинформировать пользователя о статусе электронного письма (отправлено или нет) и перенаправить его обратно на главную страницу.Проблема в том, что я не знаю, как передать alert и redirecting to main page сразу.

Вот код обработчика:

func contactHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == http.MethodPost {
        r.ParseForm()
        /* creating email */
        err := smtp.SendMail("smtp.gmail.com:587", smtp.PlainAuth("", *emailFromLogin, *emailFromPassword, "smtp.gmail.com"), *emailFrom, []string{*emailTo}, []byte(msg))
        http.Redirect(w, r, "/", http.StatusMovedPermanently)
    }
}

То, что я хочу отправить пользователю перед перенаправлением.

if err != nil {
    fmt.Fprint(w, "<script>Email didn't send<script>")
} else {
    fmt.Fprint(w, "<script>Email sent successfully<script>")
}

1 Ответ

0 голосов
/ 25 сентября 2018

Вы не можете отправить данные обратно с запросом на перенаправление, поэтому здесь есть 2 предложенных варианта.

Навигация на стороне клиента

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

Это может быть запрос AJAX, и клиентский JavaScript может обрабатывать результат и воздействовать на него: отображать сообщение и перемещаться.Вот несколько способов навигации по JavaScript на стороне клиента:

window.location = "http://new-website.com";
window.location.href = "http://new-website.com";
window.location.assign("http://new-website.com");
window.location.replace("http://new-website.com");

Кодирование сообщения в URL-адресе в качестве параметра

Другой распространенный способ - отправка перенаправления и кодирование сообщения в новом URL-адресе в видепараметр запроса, например:

newPath := "/?msg=Hello"

Это простой пример, но если сообщение является более сложным, вам нужно экранировать его, чтобы получить правильный путь.Для этого вы можете использовать url.QueryEscape() следующим образом:

msg := "Email didn't send"
path := "/?msg=" + url.QueryEscape(msg)

Это приведет к пути /?msg=Email+didn%27t+send (попробуйте на Go Playground ),Другой вариант - использовать url.URL и url.Values для сборки URL, например:

values := url.Values{}
values.Add("msg", "Email didn't send")

url := &url.URL{
    Path:     "/",
    RawQuery: values.Encode(),
}

fmt.Println(url)

Приведенные выше распечатки (попробуйте на Go Playground ):

/?msg=Email+didn%27t+send

Конечно, новая страница должна обрабатывать этот параметр запроса, например, использовать JavaScript, чтобы определить, существует ли в этом случае параметр запроса msg, и еслипоэтому, покажите его как-нибудь пользователю.

Также обратите внимание, что вы не должны использовать код StatusMovedPermanently для этого перенаправления, так как это может кэшироваться браузерами и прокси.Вместо этого используйте StatusFound.Этот код состояния указывает клиентам, что перенаправление является временным и может измениться в будущем, поэтому, если клиенту снова потребуется исходный URL-адрес, он снова запросит исходный (а не новый) автоматически.

...