2016-03-11 9 views
9

Ich möchte Client eine andere Seite zeigen, nachdem Daten von der vorherigen Seite gesammelt wurden. Aber ich habe Probleme, die neue URL auf der Serverseite umzuleiten. Hier ist meine Logik:Golang: Wie auf eine URL umleiten

  1. senden Benutzereingabe mit POST-Aktion zum Server;
  2. Server Funktion saveChoice() ausführen, um Benutzereingaben in eine Datenbank zu speichern;
  3. Nachdem Benutzereingaben gespeichert wurden, sendet der Server eine neue URL an den Client.
  4. Als der Kunde die neue URL GET, liest Server die Datenbank und die Daten gerettet werden aus

Und ich bin auf Schritt 3 stecken (hier ist ein Beispiel für die Strömung):

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 */ 
    } 
} 

Und hier ist die Vorlage:

<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> 

Darf ich wissen, wie ich auf eine neue Seite umleiten?

p.s. Wenn ich URL auf Knopf setze, dann läuft der Server nicht saveChoice()

Danke!

+0

Eigentlich der effektive Teil ist hinzuzufügen, wenn r.Method == "GET" wie Aruna sagte, die den Fehler der Umleitung 2 Seiten verhindert – Kyle

Antwort

16

Der HTTP-Status 303 ist hier die geeignete Antwort. Also leite die Anfrage damit um.

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

Und wenn Ihr newUrl soll eine richtige HTML-Seite an den Browser zurück, Sie müssen nicht Ajax verwenden. Verwenden Sie ein HTML-Formular.

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

Hinweis action der Form wird als /postHandler definiert. Geben Sie den Namen des Endpunkts ein, auf dem Ihre saveChoice-Funktion ausgeführt wird.

Um zu vermeiden, http: multiple response.WriteHeader calls Fehler erhalten Sie diesen Code verwenden.

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) 
    } 
    } 

Ansonsten versucht der Server sowohl die Form und den umgeleiteten URL zu machen, die in mutiple Anrufe an die Antwortschreiber führen.

+0

versuchte funktioniert nicht ... – Kyle

+0

Zuerst zeigt es einen Fehler, so dass ich habe preventDefault auf der Schaltfläche zu tun – Kyle

+0

Kyle bitte posten Sie den Javascript/HTML-Code, den Sie auch mit dieser Taste verwenden. –