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.
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?
Cómo utilizar el middleware
Nos fijamos en todos los gin
tonos voluntad método Default
, hay una variable método engine
, que Use
el Logger
y Recovery
dos funciones, estas dos funciones es el gin
marco 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 Use
método en la línea de canto, el problema es ahora además de estos dos middleware puede ir a Use
quié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.
Primer vistazo oficial antes de escribir Logger
y Recovery
có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 HandlerFunc
tipo, 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 main
la función en Use
él.
func main() {
r := gin.Default()
r.Use(PingYe())
r.Run()
}
El proyecto en funcionamiento, el acceso localhsot:8080
vistazo al impresionante éxito de la representación de datos.
¿Es demasiado simple? Este embrollo? Puedo golpear ah diez! ?
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 Next
mé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, "平也最帅")
}
}
Abortar
Por supuesto, además de proporcionar Next
mé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, Abort
es que la forma en que estamos buscando. Tome el ejemplo anterior, la 平也最帅
llamada a la siguiente línea del Abort
método, Where
el 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()
}
}
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.
Y mucho menos implementar una interfaz para añadir middleware, así que venga a definir dos interfaces know
y 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 Use
mé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.
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 base64
codificación, tanto de colon empalmado. Sin embargo, gansos, gin
marco BaseAuth
de 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 BasicAuth
pará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.Accounts
configuraciones convenientes que necesita para verificar la contraseña de la cuenta, gin.Accounts
se 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.MustGet
mé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 cookie
nombre.
// 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.