Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Abstract: We will mount the circuit En la barra de URL (Uniform Resource Locator) de un navegador
physically and simulated by configuring cualquiera, la petición anterior sería análoga a la siguiente
ports, performing programming in c language, for an SPI interface. dirección Web:
www.host.com/index.html
Keyword: servidor, web, protocolo, petición, datos.
Esquema de una petición GET
Petición Web
Introducción: Un servidor web o servidor HTTP es un programa
informático que procesa una aplicación del lado del servidor,
El navegador, por medio de la interfaz de usuario, permite al
realizando conexiones bidireccionales o unidireccionales y
usuario realizar una o varias peticiones Web. La interfaz de
síncronas o asíncronas con el cliente y generando o cediendo una
usuario o entorno de usuario es el conjunto de elementos del
respuesta en cualquier lenguaje o Aplicación del lado del cliente.
navegador que permiten realizar la petición de forma activa. Una
El código recibido por el cliente es renderizado por un navegador
petición Web no solo puede ser realizada mediante un navegador,
web. Para la transmisión de todos estos datos suele utilizarse algún
sino con cualquier herramienta habilitada para tal fin, como una
protocolo. Generalmente se usa el protocolo HTTP (Hyper Text
consola de comandos Telnet.
Transfer Protocol) para estas comunicaciones, perteneciente a la
capa de aplicación del modelo OSI (Open Systems
Interconnections). El término también se emplea para referirse al Elementos del entorno de usuario más comunes en navegadores
ordenador. Web visuales:
Nombre Descripción
Hipervínculo Es una porción de contenido Web, texto, imagen
enlace o link y otros elementos, que enlaza con una dirección
Web. Al pulsar un hipervínculo, el navegador
Arquitectura genera una petición GET automática a la
dirección URL de dicho link.
Formulario Al realizar el envío satisfactorio de los datos de
Petición GET Web un formulario, el navegador Web genera una
petición GET o POST (comúnmente POST)
Un servidor web opera mediante el protocolo HTTP, de la capa de automática a la par que envía los datos al
aplicación del Modelo OSI. Al protocolo HTTP se le asigna servidor.
habitualmente el puerto TCP 80 (Transmission Control Protocol). Barra de Todos los navegadores incluyen una barra de
Las peticiones al servidor suelen realizarse mediante HTTP direcciones direcciones mediante la cual puede accederse
utilizando el método de petición GET, en el que el recurso se manualmente a cualquier dirección URL, de
solicita a través de la url al servidor Web. modo que el navegador generará una petición
GET /index.html HTTP/1.1 HOST: www.host.com GET automática a dicha URL cada vez que el
usuario lo desee.
Script activo o Cualquier aplicación Javascript tiene acceso al Si la entrada no existe (si el valor de created es false) se escriben
pasivo estado del navegador, cómo puede modificar los los datos en el caché de disco. Si no, se lee directamente.
datos que describen tal estado, de forma pasiva
(sin medio de la intervención del usuario) o de 2.0 Presentación visual del recurso
forma activa (mediante alguna acción del
usuario).
Se concluye la operación y se muestra en pantalla (si es preciso) la
información.
1.1 Socket a dirección DNS
Petición GET pasiva
Se produce una socket con un servidor dado en dirección IP
(Internet Protocol) mediante TCP (Transmission Control
Protocol). Por lo general las direcciones que el navegador posee Javascript permite realizar modificaciones en el estado del
inicialmente son direcciones DNS (direcciones alfanuméricas) que navegador. El estado del navegador viene definido por el array de
deberá convertir a direcciones numéricas. objetos location del objeto global Window. Se referencia a tal
objeto con window.location. En concreto window.location.href
contiene la dirección actual del navegador Web.
1.2 Resolución de DNS a IP
Si una parte del script ejecuta tal sentencia:
Si la dirección dada es DNS y no existe una regla en la base de
datos DNS (Domine Name Server), el Host Resolver Request
solicita al servidor DNS la o las direcciones IPs correspondientes. window.location.href='http://wikipedia.org';
El navegador crea una nueva regla y almacena la dirección IP
junto a la dirección DNS en su base de datos de reglas DNS. El navegador hará tal petición Web sin que el usuario haya
mediado en tal circunstancia o sus efectos. Del mismo modo se
1.3 Recuperación de la regla DNS producirá una nueva petición GET si se altera el valor de
window.location.search o window.location.protocol.
Se produce una socket con la dirección IP mediante TCP. La La tarea del navegador Web es crear la petición a partir de los
dirección IP puede haberse recuperado en el paso anterior. datos recogidos en el entorno de usuario de elementos del mismo,
como enlaces, el valor del texto de la barra de búsqueda, los
metatags.
SOCKET 192.168.0.1
<a href="http://es.wikipedia.org">Entrar</a>
1.5 Preparación de la petición
Al pulsar en el enlace, el navegador crea automáticamente la
Se crea la petición GET estableciendo la url, un flag, la priority de petición GET y las cabeceras de la petición sobre la base de los
la petición y el método (implícitamente GET). metatags (cabeceras definidas), los cookies y cabeceras
automáticas del navegador, para luego enviarlas junto a la petición
1.6 Apertura Caché al Servidor.
Se abre y/o se crea una entrada en el http cache. Petición POST (Power On Self Test)
1.7 Efectuación de la petición Es el segundo tipo de petición HTTP más utilizado. Los datos a
enviar al servidor se incluyen en el cuerpo de la misma petición
Se realiza la petición GET. Se leen las cabeceras HTTP de la http con las cabeceras HTTP asignadas correspondientemente respecto
transaction y más tarde el cuerpo de la http transaction. al tipo de petición. Generalmente se asocia con los formularios
web en los que los datos suelen ser cifrados para enviarlos de
manera segura al servidor.
GET /index.html HTTP/1.1
Por motivos de convención se incluye en la petición la cabecera
1.8 Consulta en Caché application/x-www-form-urlencoded, que indica el formato o
codificación de los datos a enviar; esta es variable->valor en el
Se consulta en el caché de disco si existe una entrada en el caché formato: variable=valor separada cada par variable->valor por &.
asociada al recurso que se ha solicitado. Los valores son created Esta cabecera, en los formularios HTML (Hyper Text Markup
(true o false) y key (la url del recurso). Lenguage) se envía automáticamente, pero en otras tecnologías
web tal como AJAX (Asynchronous JavaScript And eXtensible
1.9 Respuesta booleana de la existencia del recurso solicitado Markup Language), si se desea hacer correctamente una petición
POST, debe ser especificado o instanciado el objeto:
setRequestHeader ("Content-type: application/x-www-form- • Cookie: Especifica un identificador de sesión en la
urlencode"); ajax.send (data); petición derivado de un cookie.
• Accept-Encoding: Especifica el tipo de codificación
Si se utilizase el método GET los datos deberían de ser añadidos a (generalmente compresión) que se espera de la
la URL, lo que los expondría a ser vistos de forma directa. respuesta. (No todos los navegadores envían esta
cabecera)
Estructura de una petición POST
Estructura de una respuesta POST
Artículo principal: Cabeceras HTTP
Artículo principal: Cabeceras HTTP
Estructura típica de una respuesta Muestra
Estructura típica de una Muestra POST
petición POST
HTTP version HTTP-version- HTTP/1.1 200 OK
Petition POST url POST comment.php HTTP/1.1 & state state
type HTTP/1.1
Date date-string Tue, 07 Jun 2011 05:52:31
Referer http-url- index.php GMT
referer
Server server-string Apache/2.2.17 (Win32)
Content- contentleng 63 mod_ssl/2.2.17...
Length ht-int
Expires expire-date- Thu, 19 Nov 1981 08:52:00
Origin http-url- http://es.wikipedia.org string GMT
origin
Cache-Control Cache-control- no-store, no-cache, must-
User- useragent- Mozilla/5.0 (Windows; U; Windows string revalidate...
Agent string NT 6.1; en-US) ...
Pragma pragma-string no-cache
Content- content- application/x-www-form-urlencoded
Content-Length Content-length- 297
Type type-string
int
Accept mimetypes- application/xml,application/xhtml+xml
Content-Type Content-type- text/html
accepted- ...
string
string
Keep-Alive Keep-alive- timeout=5, max=98
Accept- language- es-ES,es;q=0.8
string
Languag accepted-
Connection Connection- Keep-Alive
e string
string
Accept- charset- ISO-8859-1,utf-8;q=0.7,*;q=0.3
X-Powered-By X-powered-by- PHP/5.3.5
Charset accepted-
string
string
Cookie phpsessid- PHPSESSID=gm0ugf96iojuldio8i51u9
string 2716 Codificación del mensaje del cuerpo de la petición
Accept- accept- gzip,deflate,sdch
Encodin encoding- Los datos que se envían en el cuerpo de la petición POST deben
g string tener algún formato que permita manipularlos en un futuro
Content Content- &data=4&lang=es+es procesamiento. Por ello la petición debe tener asignada la cabecera
string Content-Type cuyo valor será la codificación de los datos. De este
modo el sistema podrá diferenciar entre variables aisladas, datos
Composición de una petición POST binarios, texto plano, o cualquier otro tipo de formato. El formato
de una cadena de datos se denomina MIME y es el valor que
deberá ser incluido en esta cabecera.1
Las cabeceras más comunes que se envían en una petición POST:
En HTML la cabecera Content-Type se especifica
• Petition type: Especifica el tipo de petición HTTP. (Esta automáticamente y su valor es application/x-www-form-
cabecera no tiene nombre, se envía tal cual) urlencoded, no obstante pueden especificarse por estándar otros
• Referer: Especifica la url desde la cual se hizo la dos valores: multipart/form-data y text/plain utilizando el atributo
petición POST. enctype del elemento form de la siguiente manera
• Content-Length: Especifica la longitud en bytes de los
datos enviados en el cuerpo de la petición.
<form enctype="multipart/form-data">...</form>
• Origin: Especifica la url principal del sitio.
<form enctype="text/plain">...</form>
• User-Agent: Especifica el identificador del navegador
<form enctype="application/x-www-form-urlencoded">...</form>
Web desde el cual se hizo la petición.
• Content-Type: Especifica el formato o MIME
(Multipurpose Internet Mail Extensions) de los datos O cualquier otro valor MIME. El multipart/form-data se utiliza
enviados en el cuerpo de la petición. para enviar grandes cadenas binarias que suponen cualquier otro
• Accept: Especifica el MIME que se espera en la tipo de documento que no sea texto plano, como imágenes, vídeos
respuesta. o ejecutables. Para varios valores, separar por comas.
• Accept-Language: Especifica el código del lenguaje
esperado en la respuesta. El application/x-www-form-urlencoded codifica de forma
• Accept-Charset: Especifica la codificación que se espera automática los valores de todos los elementos del formulario del
en la respuesta. modo variable=valor, separados por &. El atributo name de un
input suele ser el nombre de la variable y su value el valor. Los Las meta etiquetas, etiquetas meta o elementos meta (también
espacios se reemplazan por + y los caracteres no alfanuméricos conocidas por su nombre en inglés, metatags o meta tags) son
por $HH donde HH representa el número hexadecimal del carácter etiquetas HTML que se incorporan en el encabezado de una
ASCII (American Standard Code for Information Interchange - página web y que resultan invisibles para un visitante normal, pero
Código Estándar Americano para Intercambio de Información). de gran utilidad para navegadores u otros programas que puedan
valerse de esta información.
id=valor+de+la+variable&tama%A4o=4
Su propósito es el de incluir información (metadatos) de referencia
sobre la página: autor, título, fecha, palabras clave, descripción,
que representado de otra forma es:
etc. [4]
Metatag
Material: // Representa en lcd el texto introducido desde la aplicación web
//
1 Cristal de 20 Mhz.
////////////////////////////////////////////////////////////////////////////////
1 Push button.
1 LCD 16x2.
#include <18F4550.h>
5 Leds de colores
#device ADC=8
2 Capacitores de 22 μF.
#use delay(clock=20000000)
1 Microcontrolador 18F4550.
#fuses
1 Controlador Ethernet autónomo HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,VRE
con interfaz SPI ENC 28J60. GEN,NOPBADEN,WRTB
1 Puerto USB.
5 Resistencias de 330 Ω.
1Resistencias de 10 kΩ. /** Configuración para el uso del stack tcip **/
SERVIDOR WEB CON PIC 18F4550 Y ENC28J60 #define HTTP_SOCKET 80 //Nº de puerto asociado al
// socket.
// //
// ccs PIC C compiler v4.104 // /********** Definición del patillaje de conexión al enc28j60
******************/
// //
/* Existen varias posibilidades:
// (c) RobotyPic 2015 //
// //
Opción 1. No definir nada, en cuyo caso se implementará una
//////////////////////////////////////////////////////////////////////////////// comunicación SPI por
// Conmuta encendido-apagado de 3 leds controlados desde la software y se tomarán la definición de patillas establecida en
aplicación web // enc28j60.c
RST PIN_D3
<IMG SRC=\"http://www.robotypic.com/ryp.png\"><P>
Opción 3. El que aquí se ha utilizado, que consiste en habilitar el
uso de SPI <center> <H1>Servidor WEB con PIC 18f4550 </H1> </center>
por hardware del PIC y definir las patillas ajenas al hardware del <BR> <center> <H2>ROBOTYPIC</H2> </CENTER>
módulo SPI
para que el stack (dentro de enc28j60.c) no habilite SPI por <FORM METHOD=GET>
software. Da igual
<P>LCD: <INPUT TYPE=\"text\" NAME=\"lcd\" size=20
que patilla SO se defina, la que se deberá cablear será la SO real maxlength=16>
del PIC */
<input type=\"submit\" value=\"Enviar texto\">
</FORM>
#define ENC_MAC_USE_SPI 1 //Uso del SPI por hardware
<FORM METHOD=GET>
#define PIN_ENC_MAC_SO PIN_B0 //Entrada serie de datos
<input type=\"submit\" name=\"boton1\" value=\"Botón 1\">
//#define PIN_ENC_MAC_SI PIN_C7 //Salida serie de datos
(no necesario definir) </FORM>
</FORM> MY_MAC_BYTE1=0;
MY_MAC_BYTE2=0x04;
</FORM> MY_MAC_BYTE5=0x07;
MY_MAC_BYTE6=0x08;
</BODY> </HTML>
<BR/> MY_MASK_BYTE2=255;
MY_MASK_BYTE3=255;
MY_MASK_BYTE4=0;
<P><A HREF=\"/\">LCD/LEDs</A> }
</BODY></HTML>
";
y una secundaria (/lecturas) */ la página web con las variables del programa del PIC. Se encarga
de enviar los
int32 file_loc=0; Muestra,por tanto, las lectura obtenidas por el PIC y las representa
en la
static char index[]="/";
aplicación de la página web
static char lecturas[]="/lecturas";
int8 RE0;
printf(lcd_putc,"\n(FILE=%LU)",file_loc); //...muestra en
lcd pos. de memoria
switch(id) {
}
case '0':
else{ //Si no existe...
set_adc_channel(0);
printf(lcd_putc,"\n(File Not Found)"); //...muestra en lcd
mensaje delay_us(100);
} AD0=read_adc();
RE0=bit_test(porte,0);
/************************** FUNCIÓN FORMAT CHAR
*****************************/ sprintf(new_str,"%d",RE0);
len=strlen(new_str);
break; printf(lcd_putc,"\fCGI FILE=%LD", file);
}
return(len);
/* Se ejecutará al pulsar el botón "Botón 2" en la aplicación web
} */
if (stricmp(key,boton2_key)==0) {
output_toggle(PIN_C1);
output_low(PIN_C0); Many hardware configuration settings (SPI port and GPIO pins
used)
output_low(PIN_C1);
are defined in HardwareProfile.h.
output_low(PIN_C2);
*/
delay_ms(1000);
#use delay(crystal=20MHz)
IPAddrInit (); //Se asigna IP, mascara de red y puerta de enlace #define MIN(a,b) ((a > b) ? b : a)
elegidos
#include "tcpip/StackTsk2.h"
/* Muestra la IP elegida en lcd */
#include "tcpip/TCPIPConfig.h"
printf(lcd_putc,"\n\n IP: %u.%u.%u.%u", MY_IP_BYTE1,
MY_IP_BYTE2, MY_IP_BYTE3, MY_IP_BYTE4); #include "tcpip/HardwareProfile.h"
} WORD wTXBufferSize;
WORD wRXBufferSize;
} } TCPSocketInitializer_t;
{
/*
#if defined(STACK_USE_CCS_HTTP2_SERVER)
TCP/IP Stack enabled.
{TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM,
Many TCP/IP configuration settings (servers enabled, ports used, STACK_CCS_HTTP2_SERVER_TX_SIZE,
STACK_CCS_HTTP2_SERVER_RX_SIZE},
#endif form section. Dynamic display elements can be added or removed
from
#if defined(STACK_USE_SMTP_CLIENT)
index.htm and index.xml */
{TCP_PURPOSE_DEFAULT, TCP_ETH_RAM,
STACK_CCS_SMTP_TX_SIZE, /* TODO: Server files must be built into an MPFS image prior to
STACK_CCS_SMTP_RX_SIZE},
compiling and runing the web server. Running makempfsimg.bat
#endif in the
#if defined(STACK_USE_MY_TELNET_SERVER) /mpfs directory will create an MPFS image of the files in /pages.
{TCP_PURPOSE_TELNET, TCP_ETH_RAM, A new MPFS image has to be compiled and re-loaded if a file in
STACK_MY_TELNET_SERVER_TX_SIZE,
STACK_MY_TELNET_SERVER_RX_SIZE}, /pages needs to be changed. */
#endif
#if defined(STACK_USE_CCS_HTTP_CLIENT) unsigned int8 http_format_char(char* file, char id, char *str,
unsigned int8 max_ret)
{TCP_PURPOSE_GENERIC_TCP_CLIENT,
TCP_ETH_RAM, STACK_MY_HTTPC_TX_SIZE, {
STACK_MY_HTTPC_RX_SIZE},
/* TODO: This is a callback function to the HTTP stack.
#endif
'id' is the char for the dynamic element to be updated.
};
For each dynamic element you create, you need to parse
#else
and save a result to 'str'. *str is where the callback
#undef TCP_CONFIGURATION
function must save the formatting result, and it should
#define TCP_CONFIGURATION 1
not store more than max_ret characters to this pointer
TCPSocketInitializer_t
TCPSocketInitializer[TCP_CONFIGURATION] = (buffer-overrun protection).
{ Example:
}; case 0x00:
#endif set_adc_channel(0);
delay_us(100);
sprintf(new_str,"0x%X", i);
/* TODO: Web server enabled. Server files are added to the /pages */
column and the dynamic display elements are in the right. The text
if (id == 0)
on
{
the input buttons can be set by changing the 'value' strings in the
//TODO: Handle dyn0 field and save MY_IP_BYTE2=MY_DEFAULT_IP_ADDR_BYTE2;
result to str
MY_IP_BYTE3=MY_DEFAULT_IP_ADDR_BYTE3;
}
MY_IP_BYTE4=MY_DEFAULT_IP_ADDR_BYTE4;
return(strlen(str));
//network gateway
}
MY_GATE_BYTE1=MY_DEFAULT_GATE_BYTE1;
MY_GATE_BYTE2=MY_DEFAULT_GATE_BYTE2;
void http_exec_cgi(char* file, char *key, char *val)
MY_GATE_BYTE3=MY_DEFAULT_GATE_BYTE3;
{
MY_GATE_BYTE4=MY_DEFAULT_GATE_BYTE4;
/* TODO: This is a callback function to the HTTP stack.
if (stricmp(key,led1_key)==0) MY_MASK_BYTE4=MY_DEFAULT_MASK_BYTE4
;
LedSet (0, v);
}
*/
void main()
}
{
setup_adc_ports(AN0);
void IPAddressInit (void)
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MU
{ L_0);
MY_MAC_BYTE1=MY_DEFAULT_MAC_BYTE1; IPAddressInit ( );
MY_MAC_BYTE2=MY_DEFAULT_MAC_BYTE2; TickInit ( );
MY_MAC_BYTE4=MY_DEFAULT_MAC_BYTE4; StackInit ( );
MY_MAC_BYTE5=MY_DEFAULT_MAC_BYTE5;
MY_MAC_BYTE6=MY_DEFAULT_MAC_BYTE6;
MY_IP_BYTE1=MY_DEFAULT_IP_ADDR_BYTE1; {
Las resistencias de 330Ω y los leds de colores rojo y verde están
conectados a los puertos LED Ay LED D del controlador Ethernet
// TCP/IP code ENC 28J60.
StackTask();
Referencias web
[1] https://es.wikipedia.org/wiki/Servidor_web
[2] https://es.wikipedia.org/wiki/Socket_de_Internet
[3] https://es.wikipedia.org/wiki/Renderizaci%C3%B3n
[4] https://es.wikipedia.org/wiki/Etiqueta_meta
[5] https://es.wikipedia.org/wiki/Cookie_(inform%C3%A1tica)
Bibliografía
[6] Castillo Velázquez José Ignacio, Redes de datos, México, Ed Samsara,
2016.