2016-03-11 3 views
9

Я хотел бы показать клиенту еще одну страницу после сбора данных с предыдущей страницы. Но мне трудно перенаправить новый URL-адрес на стороне сервера. Вот моя логика:Golang: как перенаправить на URL-адрес

  1. отправить запрос пользователя с POST-действием на сервер;
  2. функция запуска сервера saveChoice() для сохранения пользовательского ввода в базу данных;
  3. После ввода пользовательского ввода сервер отправляет клиенту новый URL-адрес;
  4. К тому времени, когда клиент получить новый URL-адрес, сервер считывает базу данных и получить сохраненные данные из

И я застрял на шаге 3 (здесь пример потока):

type Stuff struct{ 
    List []string 
} 

func checkcheck(w http.ResponseWriter, r *http.Request) { 
    sinfo := Stuff{ 
     List: some_slice 
    } 

    t, err := template.New("").Parse(tpl_ds) 
    checkErr(err) 
    err = r.ParseForm() 
    checkErr(err) 
    err = t.Execute(w, sinfo) 
    checkErr(err) 

    if r.Method == "POST" { 
     saveChoice(r.Form["choices"]) 
     /* step 3: make user open another URL */ 
    } 
} 

А вот шаблон:

<html> 
<script> 
    $(function() { 
    $('form').on('submit', function (e) { 
     e.preventDefault(); 
     $.ajax({ 
     type: 'post', 
     data: $('form').serialize(), 
     }); 
    }); 
    }); 
</script> 
<body> 
    <form method="POST"> 
    {{range .List}} 
     <input type="checkbox" name="choices" value="{{.}}"> <span>{{.}}</span><br> 
    {{end}} 
    <input type="submit" value="Submit"> 
    </form> 
</body> 
</html> 

могу ли я знать, как я могу перенаправить на новую страницу?

p.s. Если я положу URL на кнопку, тогда сервер не будет запускать saveChoice()

Спасибо!

+0

Фактически эффективная часть заключается в том, чтобы добавить, если r.Method == «GET», как сказал Аруна, что предотвращает ошибку перенаправления 2 страницы – Kyle

ответ

16

http-статус 303 является подходящим ответом здесь. Поэтому перенаправьте запрос с ним.

if r.Method == "POST" { 
    saveChoice(r.Form["choices"]) 
    http.Redirect(w, r, newUrl, http.StatusSeeOther) 
} 

И если ваш newUrl должен вернуть правильный HTML-страницы в браузере, вам не нужно использовать Ajax. Используйте форму html.

<form action="/postHandler" method="post"> 
    {{range .List}} 
    <input type="checkbox" name="choices" value="{{.}}"> <span>{{.}}</span><br> 
    {{end}} 
    <input type="submit" value="Submit"> 
</form> 

Примечание action формы определяется как /postHandler. Поместите имя конечной точки, которая запускает функцию saveChoice.

Чтобы избежать ошибки http: multiple response.WriteHeader calls, вы должны использовать этот код.

func checkcheck(w http.ResponseWriter, r *http.Request) { 
    if r.Method == "GET" { 
     sinfo := Stuff{ 
     List: some_slice 
     } 

     t, err := template.New("").Parse(tpl_ds) 
     checkErr(err) 
     err = r.ParseForm() 
     checkErr(err) 
     err = t.Execute(w, sinfo) 
     checkErr(err) 
    } 

    if r.Method == "POST" { 
     saveChoice(r.Form["choices"]) 
     http.Redirect(w, r, newUrl, http.StatusSeeOther) 
    } 
    } 

В противном случае, сервер пытается оказать как форму и перенаправляется URL, который приведет к Mutiple звонков писателя ответа.

+0

, не работает ... – Kyle

+0

Сначала появляется ошибка, поэтому у меня есть чтобы сделать preventDefault на кнопке – Kyle

+0

Кайл, пожалуйста, разместите код javascript/html, который вы используете с этой кнопкой. –

Смежные вопросы