2016-03-11 13 views
9

Vorrei mostrare al cliente un'altra pagina dopo che i dati sono stati raccolti dalla pagina precedente. Ma ho problemi a reindirizzare il nuovo URL sul lato server. Ecco la mia logica:Golang: come reindirizzare a un url

  1. inviare l'input dell'utente con l'azione POST al server;
  2. funzione di esecuzione del server saveChoice() per salvare l'input dell'utente in un database;
  3. Dopo aver salvato l'input dell'utente, il server invia un nuovo URL al client;
  4. Con il tempo il cliente ottenere il nuovo URL, server legge il database e ottenere i dati salvati fuori

E mi sono bloccato sulla fase 3 (ecco un esempio del flusso):

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

E qui è il modello:

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

posso sapere come posso reindirizzare a una nuova pagina?

p.s. Se inserisco l'URL sul pulsante, il server non eseguirà saveChoice()

Grazie!

+0

In realtà la parte efficace è aggiungere se r.Method == "GET" come ha detto Aruna, che impedisce l'errore di reindirizzamento di 2 pagine – Kyle

risposta

16

Lo stato http 303 è la risposta appropriata qui. Quindi reindirizza la richiesta con esso.

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

E se il vostro newUrl deve restituire una pagina html corretto al browser, non è necessario utilizzare Ajax. Usa un modulo html.

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

Avviso action della forma è definita come /postHandler. Inserisci il nome dell'endpoint che esegue la tua funzione saveChoice lì.

Quindi per evitare l'errore http: multiple response.WriteHeader calls si ottiene utilizzare questo codice.

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

In caso contrario, il server tenta di rendere sia la forma e l'URL di reindirizzamento che si tradurrà in mutiple chiamate allo scrittore risposta.

+0

provato non funziona ... – Kyle

+0

All'inizio mostra un errore quindi ho per impedire Default sul pulsante – Kyle

+0

Kyle, si prega di postare anche il codice javascript/html che si utilizza con questo pulsante. –

Problemi correlati