Skip to content

Latest commit

 

History

History
106 lines (82 loc) · 4.65 KB

File metadata and controls

106 lines (82 loc) · 4.65 KB

4.1 Procesando la entrada de los formularios

Antes de empezar a hablar, vamos a echar un vistazo un simple ejemplo en el uso de form, guárdelo como login.gtpl en la carpeta del proyecto. login.gtpl en su carpeta del proyecto.

<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
	Username:<input type="text" name="username">
	Password:<input type="password" name="password">
	<input type="submit" value="Login">
</form>
</body>
</html>

Este form hara un /loginen el servidor. Después el usuario hace clic en el botón de registro, se enviarán los datos a la sesión de controlador en el router servidor. Entonces tenemos que saber que utilizar el método POST o GET.

Es fácil conocer esto a través del paquete http, vamos a ver cómo manejar los datos del formulario de registro en la página.

package main

import (
	"fmt"
	"html/template"
	"log"
	"net/http"
	"strings"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()  //Analizar los parámetros de URL , a continuación, analizar el paquete de respuesta para el cuerpo POST (cuerpo de la solicitud) 
	// Atención: si usted no llama método ParseForm, los siguientes datos no pueden obtenerse del form
	fmt.Println(r.Form) // impresión en el lado del servidor.
	fmt.Println("path", r.URL.Path)
	fmt.Println("scheme", r.URL.Scheme)
	fmt.Println(r.Form["url_long"])
	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ""))
	}
	fmt.Fprintf(w, "Hello astaxie!") // escribir datos de respuesta
}

func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println("method:", r.Method) //obtener método de petición
	if r.Method == "GET" {
		t, _ := template.ParseFiles("login.gtpl")
		t.Execute(w, nil)
	} else {
		r.ParseForm()
		// logic part of log in
		fmt.Println("username:", r.Form["username"])
		fmt.Println("password:", r.Form["password"])
	}
}
	
func main() {
	http.HandleFunc("/", sayhelloName) // setting router rule
	http.HandleFunc("/login", login)
	err := http.ListenAndServe(":9090", nil) // configuración de puerto de escucha
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

Ahora sabemos usar r.Method conseguir el método de solicitud y devolver una cadena como "GET", "POST", "PUT", etc

En la función de inicio de sesión , utilizamos r.Method para comprobar si se trata de un registro en la página o inicia sesión en el proceso logico, lo que significa que acaba de abrir esta página, o si está intentando entrar, el servidor muestra la página sólo cuando utiliza el metodo GET, el proceso ingresa en registro cuando se utiliza el método POST.

Usted debe ver la siguiente interfaz después de abrir http://127.0.0.1:9090/login en su navegador.

Figure 4.1 User log in interface

El Servidor no imprimirá nada después de escribir el nombre de usuario y contraseña, ahora el controlador no analiza elformulario hasta que llamamos r.ParseForm() . Vamos a añadir r.ParseForm () antes fmt.Println("username:", r.Form["username"]), compilar y probar de nuevo. Usted debe ver información se imprime en el lado del servidor ahora.

r.Form contiene todos los argumentos de petición, al igual que la cadena de consulta en la URL, los datos en la POST y PUT. Si los datos tienen conflictos como tienen el mismo nombre, se guardará en un slice con varios valores. En la documentación de Go, dice que guardará los datos de GET y POST en diferentes lugares.

Trate de cambiar el valor de la acción en el form http://127.0.0.1:9090/login a http://127.0.0.1:9090/login?username=astaxie en el archivo login.gtpl , pruebe de nuevo, y verá el slice que se imprime en el lado del servidor.

Figure 4.2 Server prints request data

El tipo de request.Form es url.Value , que guarda los datos con el formato key=value.

v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
fmt.Println(v.Get("name"))
fmt.Println(v.Get("friend"))
fmt.Println(v["friend"])

Tips Request tiene posibilidad de acceder a los datos del formulario mediante el método FormValue() . Por ejemplo, puede cambiar r.Form["username"] a r.FormValue("username") , y pide r.ParseForm automáticamente. Observe que se devuelve el primer valor si hay argumentos con el mismo nombre, y devuelve cadena vacía si no hay tal argumento.

Enlaces