Gin marco de la serie 03: un cambio en la postura entender middleware

Lo que es Middleware

Middleware, middleware Inglés traducción, como su nombre indica, en el centro del objeto, entonces, ¿quién en el centro de la misma? Originalmente, el cliente puede solicitar directamente a la interfaz del servidor.

expediente

Ahora, a tope en el middleware, puede interceptar la solicitud antes de que llegue la interfaz, hacer algún tipo de tratamiento especial, como la explotación forestal, el manejo de errores. Este es hoy para el middleware Tell, entonces marco Gin es cómo usarlo?

expediente

Cómo utilizar el middleware

Nos fijamos en todos los gintonos voluntad método Default, hay una variable método engine, que Useel Loggery Recoverydos funciones, estas dos funciones es el ginmarco de los registros y el middleware solución de problemas.

func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}

Está muy claro, el uso de middleware es llamar al Usemétodo en la línea de canto, el problema es ahora además de estos dos middleware puede ir a Usequién? No tan bueno como primero escribimos un middleware que, es más fácil de entender.

Escribir un middleware

Escribe Shane, no prestar atención a MVP producto, Nazan escribir un bucle simple, la intersección de salida de la solicitud de 平也最帅registro, el producto puede ser entregado.

expediente

Primer vistazo oficial antes de escribir Loggery Recoverycómo escribir, como cucharón de calabaza pintada.

func Logger() HandlerFunc {
	return LoggerWithConfig(LoggerConfig{})
}

func Recovery() HandlerFunc {
	return RecoveryWithWriter(DefaultErrorWriter)
}

Resultó que ambas funciones devuelven un HandlerFunctipo, entonces imitamos a escribir una función muy bien.

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
	}
}

Y puede muy simple, terminada mainla función en Useél.

func main() {
	r := gin.Default()
	r.Use(PingYe())
	r.Run()
}

El proyecto en funcionamiento, el acceso localhsot:8080vistazo al impresionante éxito de la representación de datos.

expediente

¿Es demasiado simple? Este embrollo? Puedo golpear ah diez! ?

expediente

Parece que voy a aprender durante toda su vida para usted.

Otras lecturas

próximo

Si definimos dos middleware, un piso también es el más guapo, el otro es donde el más guapo.

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
	}
}

func Where() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "在全宇宙")
	}
}

En el orden en que se registraron para enmarcar ellos, este tiempo que supongo que lo hará la primera salida de 平也最帅reexportación 在全宇宙, ¿verdad? Sí, sí, por supuesto.

func main() {
	r := gin.Default()
	r.Use(PingYe(), Where())
	r.Run()
}

Pero si yo no cambio el orden de inscripción bajo la premisa de la forma de intercambio sobre la orden, la primera salida 在全宇宙y luego la salida 平也最帅que? Utiliza el famoso Nextmétodo. Su función es llevar a cabo la siguiente middleware, ejecución terminado y luego volver a continuar con la siguiente lógica. Recuerdo que fue llamado middleware oh ~

func PingYe() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.Next()
    c.String(200, "平也最帅")
  }
}

expediente

Abortar

Por supuesto, además de proporcionar Nextmétodos, pero en teoría, debería tener un derecho de interrumpir la operación, después de todo, para obtener el middleware de verificación de autorización para hacerlo, después de la verificación falla todavía la esperanza de bloquear la solicitud. Por lo tanto, Abortes que la forma en que estamos buscando. Tome el ejemplo anterior, la 平也最帅llamada a la siguiente línea del Abortmétodo, Whereel middleware ya no está en vigor, por lo que la plana también es más que una mera guapo.

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
		c.Abort()
	}
}

expediente

middleware local

Acabo de middleware hablado tendrán efecto en todas las rutas, algunos no tienen que añadir escenario de enrutamiento middleware no será capaz de adaptarse. Por lo tanto, tenemos que tener la habilidad de ser capaz de añadir middleware como un local.

expediente

Y mucho menos implementar una interfaz para añadir middleware, así que venga a definir dos interfaces knowy unknown, lo que representa el nivel de comprensión y también no conocer las dos escenas, Reconociendo después de ese nivel es el más guapo de todo el universo, por lo que para atar el centro pedazos, no saben siquiera si el archivo. La implementación es muy simple, a la parte posterior de los parámetros de enrutamiento más fuerza suficiente middleware.

r.GET("know", PingYe(), Where())
r.GET("unknown", func(c *gin.Context) {
  c.String(200, "???")
})

Además de añadir middleware para una interfaz, también se puede añadir un conjunto de interfaces, llamar al mismo Usemétodo puede ser.

v1 := r.Group("v1")
v1.Use(PingYe(), Where())
{
  v1.GET("/know", func(c *gin.Context) {
    c.String(200, "know")
  })
  v1.GET("/unknown", func(c *gin.Context) {
    c.String(200, "unknown")
  })
}

La autenticación básica HTTP

Autenticación básica, también conocido como BasicAuth, añadir una interfaz de autenticación básica, y le proporcionará un nombre de usuario y contraseña cuando se accede a la interfaz.

expediente

Para el usuario del navegador, para la experiencia del usuario se levantará automáticamente cuadro de inicio de sesión, y en otras escenas no son, a continuación, introduzca la contraseña de cuenta dónde está? De hecho, se transmite a través de la información del encabezado, la información de cabecera hay un formato fijo para representar la autenticación básica.

Authorization: Basic <凭证>

resto de documentos es un nombre de usuario y la contraseña de base64codificación, tanto de colon empalmado. Sin embargo, gansos, ginmarco BaseAuthde middleware ya preparado todo, puede ser sólo unas pocas líneas de código serán capaces de resolver la información de autenticación básica.

func main() {
	r := gin.Default()
	r.Use(gin.BasicAuth(gin.Accounts{
		"pingye": "123",
	}))
	r.GET("/secrets", func(c *gin.Context) {
		user := c.MustGet(gin.AuthUserKey).(string)
		c.String(200, user+"已登录成功")
	})
	r.Run()
}

La parte del código de ejemplo algunos estudiantes no puede entender, como BasicAuthparámetros de método, debido a que la autenticación básica requiere nombre de usuario y contraseña para ella, por lo que podemos aprovechar las gin.Accountsconfiguraciones convenientes que necesita para verificar la contraseña de la cuenta, gin.Accountsse trata de un tipo de mapa, nombre clave del usuario nombre, representan valores de contraseña, por supuesto, se puede establecer más de un par clave-valor, establecer su propio basado en sus preferencias.

Código también apareció c.MustGetmétodos, el papel de este método es que hay que llegar a un parámetro, no tuvimos ningún panic, a tomar lo que es? Es decir gin.AuthUserKey, la explicación oficial es credenciales de autenticación básica en el usuario de cookienombre.

// AuthUserKey is the cookie name for user credential in basic auth.
const AuthUserKey = "user"

Ir ejemplos de proyecto de biblioteca lenguaje de código abierto " golang-ejemplos " Bienvenido estrellas ~

https://github.com/pingyeaa/golang-examples

Gracias por su atención, en caso de que el artículo a usted, ayudar a la atención de bienvenida al número público "nivel también está" centrando lenguaje Go y principios técnicos. mi preocupación

Supongo que te gusta

Origin www.cnblogs.com/pingyeaa/p/12667536.html
Recomendado
Clasificación