revision and correction of all chapter 3

This commit is contained in:
ma0
2016-12-15 23:09:19 -05:00
parent 599577634d
commit 618ed66ff3
4 changed files with 34 additions and 34 deletions

View File

@@ -36,7 +36,7 @@ Hablamos de que las aplicaciones web se basan en el protocolo HTTP, y Go permite
```
Después de ejecutar el código anterior, el host Local empieza a escuchar en el puerto 9090.
Abra su navegador y visite `http://localhost:9090`, se puede ver que `Hello astaxie` está en su pantalla .
Abre tu navegador y visita `http://localhost:9090`, se puede ver que `Hello astaxie` está en su pantalla .
Vamos a intentar otra dirección con argumentos: `http://localhost:9090/?url_long=111&url_long=222`
@@ -50,11 +50,11 @@ Figura 3.8 Información del servidor por pantalla
Como se puede ver, sólo tenemos que llamar a dos funciones para crear un servidor web simple.
Si está trabajando con PHP, es probable que desee preguntar qué necesitamos algo como Nginx o Apache , la respuesta es que no necesitamos porque GO escucha el puerto TCP por sí mismo, y la `sayhelloName` función es la función lógica como controlador en PHP .
Si has trabajado con PHP, es probable que te preguntes si necesitamos algo como Nginx o Apache, la respuesta es que no los necesitamos porque GO escucha el puerto TCP por sí mismo, y la función `sayhelloName` es la función lógica que funciona como controlador en PHP .
Si está trabajando con Python , usted debe saber tornado , y el ejemplo anterior es muy similar a eso.
Si has trabajado con Python, debes estar familiarizado con tornado, y el ejemplo anterior es muy similar a tornado.
Si está trabajando con Ruby, usted puede notar que es como script/server en ROR .
Si has trabajado con Ruby, usted puede notar que es como script/server en ROR.
Utilizamos dos funciones simples para configurar un servidor web simple en esta sección, y este servidor sencillo ya ha tenido capacidad para alta concurrencia. Vamos a hablar acerca de cómo usar esta característica en dos secciones siguientes .

View File

@@ -1,6 +1,6 @@
# 3.3 Como trabaja Go con la web
Hemos aprendido a utilizar el paquete `net/http` para construir un sencillo servidor web en el apartado anterior, pero todos los principios de trabajo son las mismas que hemos hablado en la primera sección de este capítulo .
Hemos aprendido a utilizar el paquete `net/http` para construir un sencillo servidor web en la sección anterior, pero todos los principios de trabajo son las mismas que hemos hablado en la primera sección de este capítulo .
## Algunos conceptos de los principios de trabajo web
@@ -18,19 +18,19 @@ La siguiente imagen muestra el flujo de trabajo del servidor web de Go.
![](images/3.3.http.png?raw=true)
Figura flujo de trabajo 3.9 http
Figura 3.9 flujo de trabajo http
1. Crear socket y escucha en un puerto, esperando a los clientes .
2. Acepta peticiones de los clientes .
3. Tramitar las solicitudes, leer el encabezado HTTP, si se utiliza el método POST, también es necesario para leer los datos en el cuerpo del mensaje y signar a los controladores. Por último , devuelve datos de respuesta a los clientes.
1. Crear socket, escuchar en un puerto y esperar a los clientes .
2. Aceptar peticiones de los clientes .
3. Tramitar las solicitudes, leer el encabezado HTTP, si se utiliza el método POST, también es necesario para leer los datos en el cuerpo del mensaje y enviarlos a los controladores. Por último, devolver los datos de respuesta a los clientes.
Una vez que conocemos las respuestas a lastres preguntas siguientes , es fácil saber cómo funciona la web en Go.
Una vez que conocemos las respuestas a las preguntas siguientes , es fácil saber cómo funciona la web en Go.
- ¿Cómo escuchar un puerto?
- ¿Cómo aceptar peticiones de cliente ?
- ¿Cómo asignar controladores ?
En la sección anterior vimos que Go utiliza ListenAndServe para manejar estos problemas : inicializar un objeto de servidor , llame net.Listen ( " tcp" , addr ) para configurar un puerto TCP de escucha y escuchar a la dirección y el puerto específico.
En la sección anterior vimos que Go utiliza ListenAndServe para manejar estas etapas: inicializar un objeto de servidor , llamar a net.Listen( "tcp" , addr ) para configurar un puerto TCP de escucha y escuchar a la dirección y el puerto específico.
Vamos a echar un vistazo a el código fuente del paquete `http`.
```
@@ -66,9 +66,9 @@ Vamos a echar un vistazo a el código fuente del paquete `http`.
}
```
¿Cómo aceptar peticiones de cliente después de escuchar el puerto? En el código fuente , podemos ver que se llama `srv.Serve(net.Listener)` para manejar peticiones de clientes . En el cuerpo de la función hay un `for{}`, se acepta la solicitud, se crea una nueva conexión y, a continuación, se inicia un nuevo goroutine , y pasa los datos de solicitud a esta goroutine: `go c.serve()`. Así es como Go es compatible con alta concurrencia , y cada goroutine es independiente.
¿Cómo aceptamos las peticiones de un cliente después que iniciamos a escuchar en un puerto? En el código fuente , podemos ver que se llama `srv.Serve(net.Listener)` para manejar peticiones de clientes. En el cuerpo de la función hay un `for{}`, se acepta la solicitud, se crea una nueva conexión y, a continuación, se inicia un nuevo goroutine , y pasa los datos de solicitud a esta goroutine: `go c.serve()`. Así es como Go es compatible con alta concurrencia, y cada goroutine es independiente.
Ahora, la forma de utilizar las funciones específicas para controlar las solicitudes? `conn` analiza la solicitud `c.ReadRequest()` al principio, y consegui el controlador correspondiente `handler : = c.server.Handler` que es el segundo argumento que pasábamos cuando llamamos `ListenAndServe`. Porque pasamos `nil`, por lo que Go usa su manejador controlador `handler = DefaultServeMux`. Entonces, ¿qué está haciendo `DefaultServeMux` aquí ? Bueno, esta es la variable de enrutador en este momento , se llama a las funciones de controlador de URL específicas . ¿Hemos fijar esto? Sí , lo hicimos. Recuerde que en la primera línea se utilizó `http.HandleFunc("/", sayhelloName)`. Es asi como se utiliza esta función para registrar el estado del router para la ruta "/". Cuando la dirección URL es `/` , el enrutador llama a la función `sayhelloName` . DefaultServeMux llama ServerHTTP para obtener la función de controlador de ruta diferente , y llama `sayhelloName` en este caso. Por último , el servidor escribe los datos y la respuesta a los clientes.
¿Cómo usamos las funciones específicas para controlar las solicitudes? `conn` analiza la solicitud `c.ReadRequest()` al principio, y obtiene el controlador correspondiente `handler : = c.server.Handler` que es el segundo argumento que pasábamos cuando llamamos `ListenAndServe`. Como pasamos `nil`, Go usa su manejador por defecto `handler = DefaultServeMux`. Entonces, ¿qué está haciendo `DefaultServeMux` aquí? Bueno, esta es la variable de enrutador en este momento, se llama a las funciones de controlador de URL específicas . ¿Hemos asignado esto? Sí, lo hicimos. Recuerde que en la primera línea se utilizó `http.HandleFunc("/", sayhelloName)`. Es asi como se utiliza esta función para registrar el estado del router para la ruta "/". Cuando la dirección URL es `/`, el enrutador llama a la función `sayhelloName` . DefaultServeMux llama ServerHTTP para obtener la función de controlador de ruta diferente, y llama `sayhelloName` en este caso. Por último , el servidor escribe los datos y la respuesta a los clientes.
Flujo de trabajo detallado:
@@ -76,7 +76,7 @@ Flujo de trabajo detallado:
Figura 3.10 Flujo de trabajo de manejar una petición HTTP
Creo que usted debe saber cómo Go se ejecuta servidores web ahora.
Creo que ahora debes saber cómo Go se ejecuta servidores web ahora.
## Enlaces

View File

@@ -4,7 +4,7 @@ En las secciones anteriores, hemos aprendido sobre el flujo de trabajo de la web
## goroutine en Conn
A diferencia de los servidores HTTP normales , Go utiliza goroutine para toda conexion que creó Conn con el fin de lograr una alta concurrencia y rendimiento, por lo que cada caso es independiente.
A diferencia de los servidores HTTP normales, Go utiliza goroutine para toda trabajo inicializado por Conn con el fin de lograr una alta concurrencia y rendimiento, por lo que cada trabajo es independiente.
Go usa el siguiente código para esperar a nuevas conexiones de clientes .
```
@@ -14,11 +14,11 @@ Go usa el siguiente código para esperar a nuevas conexiones de clientes .
}
go c.serve()
```
Como puede ver, se crea una goroutine para cada conexión , y se pasa el controlador que es capaz de leer los datos de solicitud a la goroutine .
Como puedes ver, se crea una goroutine para cada conexión , y se pasa el controlador que es capaz de leer los datos de solicitud a la goroutine.
## ServeMux personalizado
Utilizamos el enrutamiento por defecto en la sección anterior, cuando se habla conn.server , el router pasa los datos de solicitud como back-end al controlador.
Utilizamos el enrutamiento por defecto en la sección anterior, cuando hablamos de conn.server, el router pasa los datos de solicitud como back-end al controlador.
El struct del router por defecto:
```
@@ -40,7 +40,7 @@ La interfaz de Handler:
ServeHTTP(ResponseWriter, *Request) // routing implementer
}
```
`Handler` es una interfaz, pero la función `sayhelloName` no implementar su interfaz , por eso podríamos agregarlo como controlador ? Debido a que hay otro tipo `HandlerFunc` en el paquete `http` . Llamamos `HandlerFunc` definir nuestra `sayhelloName` , así `sayhelloName` implementa el `Handler` al mismo tiempo. que es como llamamos `HandlerFunc(f)`, y la función `f` es forzado convertido al tipo `HandlerFunc`.
`Handler` es una interfaz, pero la función `sayhelloName` no implementa su interfaz, entonces ¿cómo podríamos agregarla como controlador? Debido a que hay otro tipo `HandlerFunc` en el paquete `http`. Nosotros llamamos `HandlerFunc` para definir nuestro método `sayhelloName` , así `sayhelloName` implementa el `Handler` al mismo tiempo. Es como si llamaramos `HandlerFunc(f)`, y la función `f` es forzado a convertirce al tipo `HandlerFunc`.
```
type HandlerFunc func(ResponseWriter, *Request)
@@ -49,7 +49,7 @@ La interfaz de Handler:
f(w, r)
}
```
Cómo enrutador llama los controladores después de establecer reglas del router ?
¿Cómo enrutador llama los controladores después de establecer reglas del router?
El enrutador llama `mux.handler.ServeHTTP(w , r)` cuando recibe solicitudes. En otras palabras, se llama la interfaz `ServeHTTP` de los controladores.
@@ -70,9 +70,9 @@ Ahora, vamos a ver cómo funciona `mux.handler`.
return h
}
```
El router utiliza la URL como clave para encontrar correspondiente controlador que guarda en un mapa , y llama handler.ServeHTTP para ejecutar funciones para manejar los datos.
El enrutador utiliza la URL como llave para encontrar el controlador correspondiente que guarda en un mapa, luego llama handler.ServeHTTP para ejecutar funciones y manejar los datos.
Usted debe entender el flujo de trabajo del router, y Go realmente apoya routers personalizados. El segundo argumento de ListenAndServe es para la configuración del router a medida, que es una interfaz de `Handler`. Por lo tanto , se puede utilizar cualquier router que implemente la interfaz `Handler`.
En este punto, debes entender el flujo de trabajo del enrutador, y Go realmente apoya routers personalizados. El segundo argumento de ListenAndServe es para la configuración del enrutadores a la medida, entonces cualquier enrutador que implemente la interfaz de `Handler` puede ser utilizado.
El siguiente ejemplo muestra cómo implementar un enrutador sencillo.
```
@@ -106,7 +106,7 @@ El siguiente ejemplo muestra cómo implementar un enrutador sencillo.
```
# Enrutamiento
Si tu no quieres usar un router, todavía puedes lograr lo que escribimos en la sección de arriba reemplazando el segundo argumento de `ListenAndServe` a nil, y registrando las URLS usando un `HandleFunc` función que recorre todas las URLs registradas para encontrar la mejor coincidencia, entonces debemos preocuparnos por el orden de registro.
Si no quieres usar un enrutador, todavía puedes lograr lo que escribimos en la sección de arriba reemplazando el segundo argumento de `ListenAndServe` a nil, y registrando las URLS usando un `HandleFunc` función que recorre todas las URLs registradas para encontrar la mejor coincidencia, entonces debemos preocuparnos por el orden de registro.
código de ejemplo:
```
@@ -131,7 +131,7 @@ código de ejemplo:
}
}
```
Esto está bien para aplicaciones simples las cuales no necesitan ruteos parametriados, pero ¿cuándo necesitas eso? Puedes usar las herramientas o frameworks, pero como este libro está enfocado en crear aplicaciones web en Go, vamos a enseñarte como manejar ese escenario también.
Esto está bien para aplicaciones simples las cuales no necesitan ruteos parametrizados, pero ¿cuándo necesitas eso? Puedes usar las herramientas o frameworks, pero como este libro está enfocado en crear aplicaciones web en Go, vamos a enseñarte como manejar ese escenario también.
Cuando la concidencia es hecha, se llama a la función definida en `HandleFunc`, así que supongamos que estamos escribiendo un manejador para una lista y queremos eliminar una tarea, así que la aplicación decide que función se va a llamar cuando llegue la petición `/delete/1`, entonces registramos la URL de la siguiente manera:
`http.HandleFunc("/delete/", views.DeleteTaskFunc)`
@@ -172,16 +172,16 @@ Cuando la concidencia es hecha, se llama a la función definida en `HandleFunc`,
En escenarios mas complejos también podemos utilizar este método, la ventaja es que no vamos a tener que usar herramientas de terceros, pero las herramientas de terceros tienden a ser útiles en su sentido propio. Tienes que tomar la decisión de cuál método prefieres. Ninguna respuesta es la respuesta correcta.
## GO flujo de ejecución del código
## Flujo de ejecución del código en GO
Vamos a echar un vistazo a la lista de flujo de ejecución en conjunto.
- Se llama http.HandleFunc
1. Llame HandleFunc de DefaultServeMux
2. Llame Handle de DefaultServeMux
3. Agregar reglas del router para mapear [cadena ] muxEntry de DefaultServeMux
1. Se Llama HandleFunc de DefaultServeMux
2. Se Llama Handle de DefaultServeMux
3. Se agregan las reglas del enrutamiento a map[string]muxEntry de DefaultServeMux
- Se llama http.ListenAndServe (":9090" , nil )
1. se instancia el servidor
1. Se instancia el servidor
2. Llama ListenAndServe del Servidor
3. Llama net.Listen ( " tcp" , addr ) para escuchar en el puerto .
4. Iniciar un bucle, y aceptar las solicitudes en el cuerpo del bucle.

View File

@@ -2,7 +2,7 @@
En este capítulo, presentamos HTTP, el flujo de la resolución DNS y cómo construir un servidor Web simple. Entonces hablamos de cómo Go implementa servidor web para nosotros al ver el código fuente del paquete net/http.
Espero que ahora conozca mucho más sobre el desarrollo web, y usted debería ver que es muy fácil y flexible crear una aplicación web en Go.
Espero que ahora conozcas mucho más sobre el desarrollo web, y deberías ver que es muy fácil y flexible crear una aplicación web en Go.
## Enlaces