Comment rediriger vers une URL
Je voudrais montrer au client une autre page après que les données ont été collectées à partir de la page précédente. Mais j'ai du mal à rediriger la nouvelle URL côté serveur. Voici ma logique:
- soumettre l'entrée utilisateur avec l'action POST au serveur;
- le serveur exécute la fonction saveChoice () pour enregistrer l'entrée utilisateur dans une base de données;
- Une fois l'entrée utilisateur enregistrée, le serveur envoie une nouvelle URL au client;
- Au moment où le client OBTIENT la nouvelle URL, le serveur lit la base de données et récupère les données enregistrées
Et je suis coincé sur l'étape 3 (voici un exemple du flux):
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 */
}
}
Et voici le modèle:
<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>
Puis-je savoir comment je peux rediriger vers une nouvelle page?
ps Si je mets une URL sur le bouton, le serveur ne lancera pas saveChoice ()
Le statut http 303 est la réponse appropriée ici. Alors redirigez la demande avec elle.
if r.Method == "POST" {
saveChoice(r.Form["choices"])
http.Redirect(w, r, newUrl, http.StatusSeeOther)
}
Et si votre newUrl
est censé renvoyer une page HTML appropriée au navigateur, vous n'avez pas besoin d'utiliser ajax. Utilisez un formulaire html.
<form action="/postHandler" method="post">
{{range .List}}
<input type="checkbox" name="choices" value="{{.}}"> <span>{{.}}</span><br>
{{end}}
<input type="submit" value="Submit">
</form>
L'avis action
du formulaire est défini comme /postHandler
. Mettez là le nom du point de terminaison qui exécute votre saveChoice
fonction.
Donc, pour éviter les http: multiple response.WriteHeader calls
erreurs, vous utilisez ce code.
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)
}
}
Sinon, le serveur tente de rendre à la fois le formulaire et l'URL redirigée, ce qui entraînera plusieurs appels à l'enregistreur de réponses.