Merge pull request #826 from Guirdo/master

Fixed spelling/grammar error on es/02.1.md
This commit is contained in:
astaxie
2017-04-18 20:39:01 +08:00
committed by GitHub
4 changed files with 60 additions and 35 deletions

View File

@@ -1,6 +1,6 @@
## ¿Qué hace a Go diferente de otros lenguajes
El lenguaje de programación Go fue creado con una meta en mente, ser capaz de construir aplicaciones web escalables para grandes audiencias ocn un equipo grande. Esta es la razón por la cual ellos hicieron el lenguaje tan estandarizado como fuera posible, por esto razón la herramienta `gofmt` y el estricto uso de las guías base del lenguaje fueron creados por el motivo de no tener dos caras en la base del desarrollo, en otros lenguajes existen guerras religiosas en ¿Dónde debo colocar la llave abierta?
El lenguaje de programación Go fue creado con una meta en mente, ser capaz de construir aplicaciones web escalables para grandes audiencias con un equipo grande. Esta es la razón por la cual ellos hicieron el lenguaje tan estandarizado como fuera posible, por esto razón la herramienta `gofmt` y el estricto uso de las guías base del lenguaje fueron creados por el motivo de no tener dos caras en la base del desarrollo, en otros lenguajes existen guerras religiosas ¿En dónde debo colocar la llave abierta?
```
public static void main() {
@@ -15,23 +15,23 @@ El lenguaje de programación Go fue creado con una meta en mente, ser capaz de c
```
O para python debo usar 4 espacios, 6 espacios o tabulación y otras preferencias de usuario.
Esto puede parecer ser un problema superficial en la superficie, pero cuando la base de código crece y muchas mas personas están trabajando en la misma base de código, entonces es dificil mantener la "belleza" del código. Si usted conoce python, entonces usted debe ser conciente del PEP8, el cual es un conjunto de guías sobre como escribir código elegantemente. Vivimos en un mundo donde los robots pueden conducir un carro, entonces nosotros no solo debemos escribir código, debemos escribir código elegante.
Esto puede parecer ser un problema superficial, pero cuando la base de código crece y muchas mas personas están trabajando en la misma base de código, entonces es dificil mantener la "belleza" del código. Si usted conoce python, entonces debe ser conciente del PEP8, el cual es un conjunto de guías sobre como escribir código elegantemente. Vivimos en un mundo donde los robots pueden conducir un carro, entonces nosotros no solo debemos escribir código, debemos escribir código elegante.
Para otros lenguajes existen muchas variables cuando es hora de escribir código, cada lenguaje es bueno para su caso de uso, pero Go es un caso especial en esa superficie porque fue diseñado por una compañia la cual es sinónimo de Internet (y de la computación distribuida), tipicamente el flujo de escribir código va de Python a Java a C++ para propósitos de optimización, pero el problema es que casi todos los lenguajes de programación fueron escritos décadas atrás, cuando 1GB de almacenamiento tenía un costo mucho mas alto comparado con hoy en día, donde el costo de almacenamiento y computación se ha vuelto mas económico. Los computadores se están volviendo multinúcleo estos días y los "lenguajes viejos" no aprovechan la concuerrencia de la manera que Go lo hace, no porque esos lenguajes sean malos, simplemente porque el caso de uso no era reelevante cuando esos lenguajes evolucionaron.
Entonces para mitigar todos los problemas que Google enfrentó con las herramientas actuales, ellos escribieron un sustema de lenguaje llamado Go, ¡el cual estás a punto de aprendeer! Hay muchas ventajas para usar Golang, y también muchas desventajas, para cada moneda hay dos caas. Pero hay avances significativos en lugares donde el formato de código, desde que llos diseñaron el lenguaje en una manera que no habrían guerrras con como darle formato al código. El código de formato de Go, escrito por cualquier persona en el mundo (asumiendo que usan `gofmt`) se verá exactamente igual, ¡esto parecerá no importar hasta que trabajes en un equipo! también cuando una compañia usa revisión de código automatizada o alguna otra técnica lujosa, donde en otros lenguajes que no tienen un estándar en las reglas de formato, todo el código estará comprometido, ¡pero no en Go.
Entonces para mitigar todos los problemas que Google enfrentó con las herramientas actuales, ellos escribieron un sistema de lenguaje llamado Go, ¡el cual estás a punto de aprendeer! Hay muchas ventajas para usar Golang, y también muchas desventajas, para cada moneda hay dos caras. Pero hay avances significativos en lugares donde el formato de código, desde que ellos diseñaron el lenguaje en una manera que no habrían guerrras con como darle formato al código. El código de formato de Go, escrito por cualquier persona en el mundo (asumiendo que usan `gofmt`) se verá exactamente igual, ¡esto parecerá no importar hasta que trabajes en un equipo! También cuando una compañia usa revisión de código automatizada o alguna otra técnica lujosa, donde en otros lenguajes que no tienen un estándar en las reglas de formato, todo el código estará comprometido, ¡pero no en Go!
Go fue diseñado con la concurrencia en mente, por favor note que paralelismo != concurrencia. Hay un post maravilloso escrito por Bob Pike en el blog de Go, blog.golang.org, que usted encontraréa ahí y vale la pena leerlo.
Otro cambio muy importante que Go trajo a la programación y que yo personalmente amo es le concepto de `GOPATH`, los tiempos donde tenías que crear una carpeta llamadacode y entonces crear espacios de trabajo para eclipse y otros. Ahora usted puede tener un árbol de carpetas para el código en Go y se mantendrá actualizado automáticamente por el administrador de paquetes. También bajo el código que estamos recomendando crear carpetas con cada dominio específico o el dominio de github, por ejemplo yo creé un manejador de tareas usando Go, entonces creé un conjunto de carpetas
Otro cambio muy importante que Go trajo a la programación y que yo personalmente amo, es le concepto de `GOPATH`, los tiempos donde tenías que crear una carpeta llamada code y entonces crear espacios de trabajo para eclipse y otros. Ahora usted puede tener un árbol de carpetas para el código en Go y se mantendrá actualizado automáticamente por el administrador de paquetes. También bajo el código que estamos recomendando crear carpetas con cada dominio específico o el dominio de github, por ejemplo yo creé un manejador de tareas usando Go, entonces creé un conjunto de carpetas
`~/go/src/github.com/thewhitetulip/Tasks` Nota: En sistemas * nix `~` se refiere al directorio del usuario, que en windows es equivalente a `C:\\Users\\username`
Ahora el `~/go/` es el universo de código Go en su máquina, este es solo una significante mejora en comparación con otros lenguajes, entonces podemos almacenar código eficientemente sin molestias, esto puede parecer raro al comienzo pero tiene un montón de sentido a comparación de los nombres de paquete en otros lenguajes que usan sistemas como el del dominio inverso.
nota: junto con el src, existen dos carpetas adicionales, que son el `pkg` y el `bin` que es para los archivos binarios
Nota: junto con el src, existen dos carpetas adicionales, que son el `pkg` y el `bin` que es para los archivos binarios.
Estas ventajas de `GOPATH` no están restringidas a guardar código en una carpeta particular, pero cuando tu tienes creado 5 paquetes para tu proyecto entonces tu no vas a tener tiempo de importarlos como `import ./db`, usted puede escribir `import "github.com/thewhitetulip/Tasks/db"`, entonces esto hará un `go get` a mi repositorio y la herramienta `go` encontrará el paquete de `github.com/...` si no estaba descargado inicialmente, eso estandariza un montón de cosas en la disciplina de la programación.
Algunos se quejan que los creadores de go han ignorado toda la investigación de lengaujes hecha los pasados 30 años, bueno, esto puede ser verdad, pero de nuevo, no puedes crear un lenguaje que todo mundo ame, siempre hay alguna u otra causa o restricción que hace a los creadores considerar, y considerando todas las ventajas al menos para el desarrollo web, yo no creo que algún lenguaje se acerque tanto a las ventajas que ha alcanzado `Go`, incluso si ignoras todo lo que he dicho arriba, Go es u lenguaje compilado, lo que significa que en producción no vas a tener que configurar un `JVM` o un `virtualenv`, ¡solo vas a tener un un estático binario! y como un cubo de hielo en un pastel, todas las librerías modernas están en la librería estándar, como `http`, lo cual es una ventaja mayor, es la razón principal por la que puedes crear aplicaciones web en Go sin tener que usar un framework de terceros.
Algunos se quejan que los creadores de go han ignorado toda la investigación de lenguajes hecha los pasados 30 años, bueno, esto puede ser verdad, pero de nuevo, no puedes crear un lenguaje que todo mundo ame, siempre hay alguna u otra causa o restricción que hace a los creadores considerar, y considerando todas las ventajas al menos para el desarrollo web, yo no creo que algún lenguaje se acerque tanto a las ventajas que ha alcanzado `Go`, incluso si ignoras todo lo que he dicho arriba, Go es un lenguaje compilado, lo que significa que en producción no vas a tener que configurar un `JVM` o un `virtualenv`, ¡solo vas a tener un estático binario! y como un cubo de hielo en un pastel, todas las librerías modernas están en la librería estándar, como `http`, lo cual es una ventaja mayor, es la razón principal por la que puedes crear aplicaciones web en Go sin tener que usar un framework de terceros.
# 2.1 Hola, Go
@@ -39,7 +39,7 @@ Antes de comenzar a contruir una aplicación en Go, necesitamos aprender como es
## Programa
De acuerdo con la prácica internaciona, antes de que tu puedas contruir en algún lenguaje, usted querrá escribir un programa que imporima "Hola Mundo".
De acuerdo con la prácica internacional, antes de que tú puedas construir en algún lenguaje, querrás escribir un programa que imprima "Hola Mundo".
¿Estamos listos? ¡Empecemos!
```
@@ -51,40 +51,40 @@ De acuerdo con la prácica internaciona, antes de que tu puedas contruir en alg
fmt.Printf("Hola, mundo o 你好,世界 o καλημ ́ρα κóσμ o こんにちは世界\n")
}
```
Esto imprime la siguiente información
Esto imprime la siguiente información.
```
Hola, mundo o 你好,世界 o καλημ ́ρα κóσμ o こんにちは世界
```
## Explanation
## Explicación
Una cosa que usted debería tener en cuanta es que los programas en Go están compuestos por `package`s o paquetes.
Una cosa que deberías tener en cuanta, es que los programas en Go están compuestos por `package`s o paquetes.
`package <nombreDelPaquete>` (En este caso es `package main`) nos dice que el archivo pertenece al paquete `main` y la palabra main nos dice que este paquete será compilado a un programa en vez de a un archivo cuya extensión es `.a`.
Cada programa ejecutable tendrá un solo paquete `main` y una única función de enrtada llamada `main`sin ningún argumento de entrada o salidad en el paquete `main`.
Cada programa ejecutable tendrá un solo paquete `main` y una única función de entrada llamada `main` sin ningún argumento de entrada o salida en el paquete `main`.
En orden de imprimir `Hola, mundo ...` llamamos a una función llamada `Printf`. Esta funcieon viene del paquete `fmt`, entonces importamos este paquete en la tercera línea de código, que es `import "fmt"`
La manera de pensar sobre estos paquetes es similar a Python, y hay muchas otras ventajas: Modularidad (dividir tu programa en muchos módulos) y reusabilidad (cada módulo puede ser reusado en muchos programas). Nosotros solo hemos hablado sobre los conceptos relacionado con los paquetes, y luego daremos un paseo por nuestros propios paquetes, después.
En la quinta línea, usamos la palabra reservada `func` para definir la función `main`. El cuerpo d ela función está dentro de `{}`, como en C, C++ o Java.
En la quinta línea, usamos la palabra reservada `func` para definir la función `main`. El cuerpo de la función está dentro de `{}`, como en C, C++ o Java.
Como puedes ver, no hay argumentos. Aprenderemos como escribir una función con argumentos en un segundo, y también hay funciones que no retornan nada o que retornan muchos valores.
En la sexta lína, llamamos la la funcieon `Printf` la cual pertenece al paquete `fmt`. Esta fue llamada por la sintaxis `<nombreDelPaquete>.<nombreDeLaFunción>`, que es mucho el estilo de Python.
En la sexta lína, llamamos la funcieon `Printf` la cual pertenece al paquete `fmt`. Esta fue llamada por la sintaxis `<nombreDelPaquete>.<nombreDeLaFunción>`, que es mucho el estilo de Python.
Como mencionamos en el capítulo 1, el nombre de paquete y el nombre de la carpeta que contiene el archivo puede ser diferente. Aquí el `nombreDelPaquete` viene del nombre en `package <nombreDelPaquete>`, no del nombre de la carpeta.
Usted se puede dar cuenta que el ejemplo de arriba contiene catacteres no ASCII. El propósito de mostrar esto es para decir que Go soporta UTF-8 por defecto. Usted puede usar cualquier caracter UTF-8 en sus programas.
Usted se puede dar cuenta que el ejemplo de arriba contiene caracteres no ASCII. El propósito de mostrar esto es para decir que Go soporta UTF-8 por defecto. Usted puede usar cualquier caracter UTF-8 en sus programas.
Cada archivo en Go está en algún pauqete, y el paquete debería estar en una carpeta distina en el GOPATH, pero el paquete `main` no requiere estar en una carpeta llamada `main`. ¡Este es un aspecto que ellos dejaron fuera de la estandarización! Pero si usted escoge crear una carpeta llamada main, tiene que asegurarse de ejecutar el binario correctamente. Un programa en go no puede tener mas de 1 archivo main.
Cada archivo en Go está en algún paquete, y el paquete debería estar en una carpeta distinta en el GOPATH, pero el paquete `main` no requiere estar en una carpeta llamada `main`. ¡Este es un aspecto que ellos dejaron fuera de la estandarización! Pero si usted escoge crear una carpeta llamada main, tiene que asegurarse de ejecutar el binario correctamente. Un programa en go no puede tener mas de 1 archivo main.
`~/go/src/github.com/thewhitetulip/Tasks/main $ go build`
`~/go/src/github.com/thewhitetulip/Tasks $ ./main/main`
El detalle aquí es que cuando está usando algun archivo estático o algo mas, entonces vas a tener que ejecutar el archivo desde la raiz de la aplicación, como se ve en la segunda línea de arriba. Estoy ejecutando el binario `main` *fuera* del paquete main, en algún momento notarás que nuestra aplicación no está funcionando de la manera que queremos, por esta razón, para evitar problemas, mantenga esto en mente.
Una caosa que usted puede notar es que Go no usa punto y comas para terminar una sentencia, bueno, si lo hace, solo que el usuario no tiene que preocuparse por colocar los punto y comas, el compilador agregas los punto y comas al final del gocode, por esta razón esto es un error de sintaxis
Una cosa que usted puede notar es que Go no usa punto y comas para terminar una sentencia, bueno, si lo hace, solo que el usuario no tiene que preocuparse por colocar los punto y comas, el compilador agregas los punto y comas al final del gocode, por esta razón esto es un error de sintaxis
```
func main ()
{

View File

@@ -2,9 +2,9 @@
## Interfaces
Una de las características de diseño mas sutiles en Go son las interfaces. Después de leer esta sección, probablemente quedara impresionado por su implementación.
Una de las características de diseño más sutiles en Go son las interfaces. Después de leer esta sección, probablemente quedara impresionado por su implementación.
### Que es una interfaz?
### ¿Que es una interfaz?
En pocas palabras, una interfaz es un conjunto de métodos, que se usan para definir un conjunto de acciones.
@@ -19,6 +19,7 @@ Esta combinación de métodos es llamada interfaz, y es implementada por Student
### Tipo de Interfaces
Una interfaz define un grupo de métodos, entonces si un tipo implementa todos los métodos entonces nosotros decimos que ese tipo implementa la interfaz.
```
type Human struct {
name string
@@ -89,9 +90,10 @@ Tenga en cuenta que todos los tipos implementan la interfaz vacía `interface{}`
### Valor de una interfaz
Entonces, que tipo de valores se puede poner en una interfaz? Si definimos una variable como tipo interfaz, cualquier tipo que implemente la interfaz puede asignarse a esta variable.
Entonces, ¿qué tipo de valores se pueden poner en una interfaz? Si definimos una variable como tipo interfaz, cualquier tipo que implemente la interfaz puede asignarse a esta variable.
Al igual que en el ejemplo anterior, si definimos una variable m como la interfaz Men, entonces cualquier Student, Human o Employee puede ser asignado a m. Entonces podríamos tener una lista de Men, y cualquier tipo que implemente la interfaz Men puede agregarse a esa lista (slice). Sin embargo sea consciente que una lista de interfaces no tiene el mismo comportamiento que una lista de otros tipos.
```
package main
@@ -172,6 +174,7 @@ Una interfaz es un conjunto de métodos abstractos, y puede ser implementada por
### Interfaz vacía
Una interfaz vacía es una interfaz que no contiene ningún método, entonces todos los tipos implementan una interfaz vacía. Es muy útil cuando buscamos guardar todos los tipos en el mismo lugar, y es similar a void* en C.
```
// definimos una interfaz vacía
var a interface{}
@@ -188,12 +191,15 @@ Si una función usa una interfaz vacía como su tipo de argumento, esta puede ac
Cualquier variable puede usarse en una interfaz, entonces podemos pensar sobre como podemos usar esta característica para pasar cualquier tipo de variable a una función.
Por ejemplo, usamos mucho fmt.Println, pero alguna vez notaste que ¿acepta cualquier tipo de argumento? Si vemos el código fuente de fmt que es libre, podemos ver la siguiente definición.
```
type Stringer interface {
String() string
}
```
```
Esto significa que cualquier tipo que implemente la interfaz Stringer puede ser pasada a fmt.Println como argumento. Vamos a probarlo.
```
package main
@@ -220,10 +226,12 @@ Esto significa que cualquier tipo que implemente la interfaz Stringer puede ser
```
Volviendo atrás al ejemplo de Box, podemos ver que Color también implementa la interfaz Stringer, por lo que somos capaces de personalizar el formato de impresión. Si no implementamos esa interfaz, fmt.Println imprimirá el tipo con el formato por defecto.
```
fmt.Println("The biggest one is", boxes.BiggestsColor().String())
fmt.Println("The biggest one is", boxes.BiggestsColor())
```
Atención: Si el tipo implementa la interfaz `error`, fmt va a llamar a `error()`, entonces en este punto no tendrás que implementar Stringer.
### Tipos de variables en un interfaz
@@ -237,6 +245,7 @@ Go tiene la sintaxis `value, ok := element.(T)`. Esto comprueba si la variable e
Si el elemento es del tipo que esperamos, ok será true, en otro caso será false.
Veamos un ejemplo para verlo con más claridad.
```
package main
@@ -276,11 +285,13 @@ Veamos un ejemplo para verlo con más claridad.
}
}
```
Es bastante sencillo usar este patrón, pero si tenemos que verificar varios tipos, es mejor que usemos un `switch`.
- Verificación con un switch
Vamos a ver el uso de `switch` para reescribir el ejemplo anterior.
```
package main
@@ -329,14 +340,17 @@ Una cosa que deberíamos recordar es que `element.(type)` no puede ser usado fue
La cosa más atractiva es que Go tiene mucha lógica embebida en su sintaxis, como campos anónimos en un struct. No es para sorprenderse, que podamos usar interfaces también como campos anónimos, pero vamos a llamarlas `Interfaces embebidas`. Aquí, vamos a seguir las mismas reglas que para los campos anónimos. Más específicamente, si una interfaz tiene otra interfaz como una interfaz embebida, esta tendrá todos los métodos que la clase embebida tiene.
Podemos ver el archivo fuente `container/heap` que tiene una definición como la siguiente.
```
type Interface interface {
sort.Interface // embebida sort.Interface
Push(x interface{}) //el método Push para empujar elementos a la pila
Pop() interface{} //el elemento Pop que saca elementos de la pila
}
```
Podemos ver que `sort.Interface` es una interfaz embebida, por lo que la interfaz anterior tiene tres métodos que son explícitos de `sort.Interface`.
```
type Interface interface {
// Len es el número de elementos en la colección.
@@ -348,38 +362,48 @@ Podemos ver que `sort.Interface` es una interfaz embebida, por lo que la interfa
Swap(i, j int)
}
```
Otro ejemplo es el de `io.ReadWriter` en el paquete `io`.
```
// io.ReadWriter
type ReadWriter interface {
Reader
Writer
}
```
### Reflexión
La reflexión en Go es usada para obtener información en tiempo de ejecución. Vamos a usar el paquete `reflect`, y este articulo oficial [articulo](http://golang.org/doc/articles/laws_of_reflection.html) explica como funciona la reflexión en Go.
Tenemos que realizar tres pasos para usar reflect. Primero, necesitamos convertir una interfaz en un tipo reflect types (reflect.Type o reflect.Value, depende en que situación nos encontremos).
```
t := reflect.TypeOf(i) // tomamos la meta-data de el tipo i, y usamos t para tomar todos los elementos
v := reflect.ValueOf(i) // tomamos el valor actual de el tipo i, y usamos v para cambiar este valor
```
Después de eso, necesitamos convertir el tipo reflect de el valor que tomamos a el tipo que necesitamos.
```
var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())
```
Finalmente, si buscamos cambiar el valor que vino del tipo reflects, necesitamos hacerlo modificable. Como hablamos antes, esta es una diferencia entre pasar por valor o por referencia. El siguiente código no compilará.
```
var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)
```
En lugar de eso, debemos usar el siguiente código para cambiar el valor de los tipos reflect.
```
var x float64 = 3.4
p := reflect.ValueOf(&x)

View File

@@ -1,4 +1,4 @@
#3 Conocimientos básicos sobre la Web
# 3 Conocimientos básicos sobre la Web
La razón por la que estas leyendo este libro, es porque estas buscando aprender a desarrollar aplicaciones web con Go. Como dije antes, Go nos provee muchos paquetes con un gran potencial como es el `http`. Este nos ayudará mucho cuando queramos desarrollar aplicaciones web. En los siguientes capítulos te voy a enseñar todo lo que necesita saber, en este capítulo vamos a hablar sobre algunos conceptos sobre la web y como correr aplicaciones web en Go.

View File

@@ -1,8 +1,8 @@
# 3.1. Principios para el trabajo en la Web

Cada vez que abres tu navegador, escribes alguna direccion URL y pulsas ENTER, verás hermosas páginas web que aparecen en pantalla. Pero ¿sabes lo que está sucediendo detrás de esta simple acción?
Cada vez que abres tu navegador, escribes alguna direccion URL y pulsas ENTER, verás hermosas páginas web que aparecen en pantalla. Pero, ¿sabes lo que está sucediendo detrás de esta simple acción?
Normalmente, el navegador es un cliente, después de teclear la URL, envía peticiones a un servidor DNS, para obtener la dirección IP de la URL. Luego de encontrar el servidor en esta dirección IP, configura una conexión TCP. El navegador envía las peticiones HTTP a través de la conección. El servidor las maneja y responde con respuestas HTTP que conteienne el contenido que puedes ver en tu página web. Finalmente, el navegador renderiza el cuerpo de la página web y se desconecta del servidor.
Normalmente, el navegador es un cliente, después de teclear la URL, envía peticiones a un servidor DNS, para obtener la dirección IP de la URL. Luego de encontrar el servidor en esta dirección IP, configura una conexión TCP. El navegador envía las peticiones HTTP a través de la conexión. El servidor las maneja y responde con respuestas HTTP que conteienne el contenido que puedes ver en tu página web. Finalmente, el navegador renderiza el cuerpo de la página web y se desconecta del servidor.
![](images/3.1.web2.png?raw=true)
@@ -23,7 +23,8 @@ Este es un sencillo flujo de trabajo de asuntos HTTP, observe que el servidor de
Siempre estamos utilizando URL para acceder a páginas web , pero ¿sabes cómo funciona el URL ?
El nombre completo de la dirección URL es Uniform Resource Locator (Localizador de Recursos Uniforme), esto es para la descripción de recursos en Internet. Su forma básica como sigue .
El nombre completo de la dirección URL es Uniform Resource Locator (Localizador de Recursos Uniforme), esto es para la descripción de recursos en Internet. Su forma básica como sigue.
```
esquema://host[:port #]/ruta/.../[? cadena de consulta ][# ancla ]
esquema: asignación de protocolo subyacente (como HTTP , HTTPS, FTP )
@@ -45,11 +46,11 @@ Para entender más acerca de su principio de funcionamiento, veamos en detalle
1. Después de escrito el nombre de dominio www.qq.com en el navegador , el sistema operativo comprueba si hay alguna relación de correspondencia en el archivo hosts para el nombre de dominio, si es así, termina la resolución de nombres de dominio.
2. Si no hay relación de proyección en el archivo hosts, el sistema operativo comprueba si hay alguna caché en el DNS, si es así, termina la resolución de nombres de dominio.
3. Si no hay relación entre el computador y el servirdor de caché DNS, el sistema operativo busca el primer servidor de resolución de DNS en la configuración de TCP / IP, que es el servidor DNS local en este momento. Cuando el servidor DNS local recibió consulta, si el nombre de dominio que desea consultar está contenida en la configuración local de los recursos regionales, a continuación, devuelve los resultados al cliente . Esta resolución DNS es autoritaria .
4. Si el servidor DNS local no contiene el nombre de dominio , y hay una relación de correspondencia en con el servidor caché DNS, el servidor DNS local devuelve este resultado a cliente. Esta resolución DNS no es autoritaria.
5. Si el servidor DNS local no puede resolver el nombre de dominio , ya sea por la configuración de los recursos regionales o caché, se procede al próximo paso, que depende de la configuración del servidor DNS local. Si el servidor local de DNS no permite seguir avanzando, el enruta la petición a la raiz del servidor DNS, entonces returna la dirección IP de un servidor DNS de alto nivel, que debería conocer el nombre de dominio, `.com` en este caso. Si el primer servidor de mas alto nivel no reconoce el nombre de dominio, de nuevo re enruta la petición al siguiente servidor DNS de mayor nivel, así sucesivamente hasta que encuentre un servidor DNS que pueda reconocer el nombre de dominio. Entonces, se le solicita al servidor DNS la IP correspondiente al dominio, en este caso `www.qq.com`
- Si el servidor DNS local habilita seguir adelante, envía la solicitud al servidor DNS de nivel superior , si el servidor DNS de nivel superior también no sabe el nombre de dominio , a continuación, seguira enviando solicitudes a nivel superior.
- Si el servidor DNS local permite a modo de avance , la dirección IP del servidor de nombre de dominio devuelve al servidor DNS local , y el servidor local envía a los clientes.
3. Si no hay relación entre el computador y el servirdor de caché DNS, el sistema operativo busca el primer servidor de resolución de DNS en la configuración de TCP / IP, que es el servidor DNS local en este momento. Cuando el servidor DNS local recibió consulta, si el nombre de dominio que desea consultar está contenida en la configuración local de los recursos regionales, a continuación, devuelve los resultados al cliente. Esta resolución DNS es autoritaria.
4. Si el servidor DNS local no contiene el nombre de dominio, y hay una relación de correspondencia en con el servidor caché DNS, el servidor DNS local devuelve este resultado a cliente. Esta resolución DNS no es autoritaria.
5. Si el servidor DNS local no puede resolver el nombre de dominio, ya sea por la configuración de los recursos regionales o caché, se procede al próximo paso, que depende de la configuración del servidor DNS local. Si el servidor local de DNS no permite seguir avanzando, el enruta la petición a la raiz del servidor DNS, entonces returna la dirección IP de un servidor DNS de alto nivel, que debería conocer el nombre de dominio, `.com` en este caso. Si el primer servidor de mas alto nivel no reconoce el nombre de dominio, de nuevo re enruta la petición al siguiente servidor DNS de mayor nivel, así sucesivamente hasta que encuentre un servidor DNS que pueda reconocer el nombre de dominio. Entonces, se le solicita al servidor DNS la IP correspondiente al dominio, en este caso `www.qq.com`
- Si el servidor DNS local habilita seguir adelante, envía la solicitud al servidor DNS de nivel superior, si el servidor DNS de nivel superior también no sabe el nombre de dominio , a continuación, seguira enviando solicitudes a nivel superior.
- Si el servidor DNS local permite a modo de avance , la dirección IP del servidor de nombre de dominio devuelve al servidor DNS local, y el servidor local envía a los clientes.
Sea que el cliente DNS local habilite o no el redireccionamiento, la dirección IP del dominio siempre se retornará al serviror local de DNS, y el servidor local DNS se lo enviará de vuelta al cliente
@@ -59,13 +60,13 @@ Figura 3.3 DNS flujo de trabajo de resolución.
`Proceso de consulta recursiva` significa que las solicitudes de información están cambiando en el proceso, encambio las solicitudes de información no cambian en el proceso de consulta iterativa .
Ahora sabemos que los clientes obtendran direcciones IP , al final, por lo que los navegadores estan comunicandose con los servidores a través de las direcciones IP.
Ahora sabemos que los clientes obtendran direcciones IP , al final, por lo que los navegadores estan comunicandose con los servidores a través de las direcciones IP.
## Protocolo HTTP
Protocolo HTTP es la parte fundamental de los servicios web. Es importante saber lo que es el protocolo HTTP antes de entender cómo funciona la web.
HTTP es el protocolo que se utiliza para la comunicación entre navegadores y servidores web, se basa en el protocolo TCP, y por lo general utilizan el puerto 80 en el servidor web. Es un protocolo que utiliza el modelo de petición-respuesta, los clientes envían peticiones y el servidor responde. De acuerdo con el protocolo HTTP, los clientes siempre configuran una nueva conexión y envian una petición HTTP al servidor en cada asunto. Los servidor no son capaces de conectar con el cliente de forma proactiva, o establecer conexiones que inicien desde ellos. La conexión entre el cliente y el servidor puede ser cerrada por cualquier lado. Por ejemplo, puedes cancelar su tarea de descarga y conexión HTTP tu navegador se desconecta del servidor antes de que termine la descarga.
HTTP es el protocolo que se utiliza para la comunicación entre navegadores y servidores web, se basa en el protocolo TCP, y por lo general utilizan el puerto 80 en el servidor web. Es un protocolo que utiliza el modelo de petición-respuesta, los clientes envían peticiones y el servidor responde. De acuerdo con el protocolo HTTP, los clientes siempre configuran una nueva conexión y envian una petición HTTP al servidor en cada asunto. Los servidor no son capaces de conectar con el cliente de forma proactiva, o establecer conexiones que inicien desde ellos. La conexión entre el cliente y el servidor puede ser cerrada por cualquier lado. Por ejemplo, puedes cancelar su tarea de descarga y conexión HTTP tu navegador se desconecta del servidor antes de que termine la descarga.
El protocolo HTTP no tiene estado, lo que significa que el servidor no tiene idea acerca de la relación entre dos conexiones, a pesar de que puedan ser ambas de un mismo cliente. Para solucionar este problema, las aplicaciones web usan Cookies para mantener el estado sostenible de conexiones.
@@ -94,9 +95,9 @@ Figura 3.4 Información de método GET capturado por fiddler
Figura 3.5 Información de método POST capturado por fiddler
**Podemos ver que el método GET no tiene cuerpo de la solicitud, el método POST si.**
**Podemos ver que el método GET no tiene cuerpo de la solicitud, el método POST sí.**
Hay muchos métodos que puede utilizar para comunicarse con los servidores de HTTP ; GET, POST, PUT, DELETE son los 4 métodos básicos que utilizamos. Una URL representa un recurso en la red, por lo que estos 4 métodos significan consultar, cambiar, agregar y eliminar operaciones. GET y POST son los más utilizados en HTTP. GET puede añadir los parámetros de búsqueda usando el separador `?` para separa la URL de los parámetros y `&` entre parámetros como por ejemplo: `EditPosts.aspx?name=test1&id=123456`. POST puede colocar muchísima mas información en el cuerpo d ela petición, porque la URL solo puede tener un tamaño máximo, dependiendo del navegador. También, cuando pasamos nuestro nombre de usuario y contraseña , no queremos que este tipo de información aparesca en la URL, por lo que utilizamos la POST para mantenerlos invisibles.
Hay muchos métodos que puede utilizar para comunicarse con los servidores de HTTP ; GET, POST, PUT, DELETE son los 4 métodos básicos que utilizamos. Una URL representa un recurso en la red, por lo que estos 4 métodos significan consultar, cambiar, agregar y eliminar operaciones. GET y POST son los más utilizados en HTTP. GET puede añadir los parámetros de búsqueda usando el separador `?` para separa la URL de los parámetros y `&` entre parámetros como por ejemplo: `EditPosts.aspx?name=test1&id=123456`. POST puede colocar muchísima mas información en el cuerpo de la petición, porque la URL solo puede tener un tamaño máximo, dependiendo del navegador. También, cuando pasamos nuestro nombre de usuario y contraseña, no queremos que este tipo de información aparesca en la URL, por lo que utilizamos la POST para mantenerlos invisibles.
### Paquete de respuesta HTTP (información del servidor)
@@ -130,7 +131,7 @@ Figura 3.6 La información completa al visitar un sitio web
### HTTP no tiene estado y la conexion: keep-alive
Sin Estado no significa que el servidor no tiene la capacidad para mantener una conexión. Simplemente significa que el servidor no distingue la relación entre dos peticiones .
Sin Estado no significa que el servidor no tiene la capacidad para mantener una conexión. Simplemente significa que el servidor no distingue la relación entre dos peticiones.
En HTTP/1.1 , Keep-alive se utiliza como valor predeterminado , si los clientes tienen más solicitudes, van a utilizar la misma conexión para muchas peticiones diferentes.
@@ -146,7 +147,7 @@ Podemos ver todo el proceso de comunicación entre el cliente y el servidor en l
Esta es la función más importante de los navegadores, solicitud de una URL y obtener datos de los servidores web, y luego renderizar HTML para tener una buena interfaz de usuario. Si encuentra algún archivo en el DOM, como archivos CSS o JS, los navegadores solicitarán estos recursos al servidor nuevamente, hasta que todos los recursos terminen de renderizarse en la pantalla.
Reducir las veces que se hacen peticiones HTTP es una manera de mejorar la velocidad de carga de las páginas. Al reducir el número de peticiones CSS y JS que tienen que ser cargadas, la latencia de petición y la presión en tu servidor web puede ser reducida al mismo tiempo
Reducir las veces que se hacen peticiones HTTP es una manera de mejorar la velocidad de carga de las páginas. Al reducir el número de peticiones CSS y JS que tienen que ser cargadas, la latencia de petición y la presión en tu servidor web puede ser reducida al mismo tiempo.
## Enlaces