HTTP
Funciones
Http* | http_create (...) |
Http* | http_secure (...) |
void | http_destroy (...) |
void | http_clear_headers (...) |
void | http_add_header (...) |
bool_t | http_get (...) |
bool_t | http_post (...) |
uint32_t | http_response_status (...) |
const char_t* | http_response_protocol (...) |
const char_t* | http_response_message (...) |
uint32_t | http_response_size (...) |
const char_t* | http_response_name (...) |
const char_t* | http_response_value (...) |
const char_t* | http_response_header (...) |
bool_t | http_response_body (...) |
Stream* | http_dget (...) |
bool_t | http_exists (...) |
Es habitual que una aplicación necesite información más allá de la almacenada en el propio computador. La forma más sencilla y habitual de compartir información es almacenarla en un Servidor Web y publicar una URL que provea el contenido deseado (Figura 1). Este esquema cliente/servidor utiliza el protocolo HTTP/HTTPS, que fue originalmente diseñado para transmitir documentos HTML entre servidores Web y navegadores. Debido a la gran repercusión que ha tenido a lo largo de los años, se ha ido ampliando su uso para el intercambio de información estructurada entre cualquier aplicación que "entienda" HTTP. La respuesta del servidor será, por lo general, un bloque de texto formateado en JSON o XML.
- Utiliza http_dget para descargar un recurso a partir de su URL (Listado 1).
- Utiliza http_create para crear una sesión HTTP.
- Utiliza http_secure para crear una sesión HTTPS (encriptado).
1 2 3 4 5 6 7 8 9 |
Por otro lado, si vamos a realizar sucesivas llamadas a un mismo servidor o si necesitamos mayor control sobre las cabeceras HTTP, deberemos crear una sesión (Listado 2).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Stream *webpage = NULL; Http *http = http_secure("nappgui.com", UINT16_MAX); if (http_get(http, "/en/start/win_mac_linux.html", NULL, 0, NULL) == TRUE) { if (http_response_status(http) == 200) { webpage = stm_memory(1024); if (http_response_body(http, webpage, NULL) == FALSE) stm_close(&webpage); } } http_destroy(&http); if (webpage != NULL) { ... stm_close(&webpage); } |
http_create ()
Crea una sesión HTTP.
Http* http_create(const char_t *host, const uint16_t port);
host | Nombre del servidor. |
port | Puerto de conexión. Si pasamos |
Retorna
Sesión HTTP.
http_secure ()
Crea una sesión HTTPS.
Http* http_secure(const char_t *host, const uint16_t port);
host | Nombre del servidor. |
port | Puerto de conexión. Si pasamos |
Retorna
Sesión HTTPS.
http_destroy ()
Destruye una sesión HTTP.
void http_destroy(Http **http);
http | La sesión HTTP. Será puesto a |
http_clear_headers ()
Elimina las cabeceras HTTP previamente asignadas.
void http_clear_headers(Http *http);
http | La sesión HTTP. |
http_add_header ()
Añade una cabecera a la petición HTTP.
void http_add_header(Http *http, const char_t *name, const char_t *value);
http | La sesión HTTP. |
name | El nombre de la cabecera. |
value | El valor de la cabecera. |
http_get ()
Realiza una petición tipo GET.
bool_t http_get(Http *http, const char_t *path, const byte_t *data, const uint32_t size, ierror_t *error);
http | La sesión HTTP. |
path | Dirección del recurso. |
data | Datos para añadir en el cuerpo de la petición. Puede ser |
size | Tamaño en bytes del bloque de datos. |
error | Código de error si la función falla. Puede ser |
Retorna
TRUE
si la petición se ha llevado a cabo correctamente. Si FALSE
, en error
tendremos la causa.
Observaciones
La petición es síncrona, es decir, el programa quedará detenido hasta que el servidor responda. Si queremos un modelo asíncrono deberemos crear un hilo paralelo que gestione la petición. Las redirecciones HTTP se resuelven automáticamente.
http_post ()
Realiza una petición tipo POST.
bool_t http_post(Http *http, const char_t *path, const byte_t *data, const uint32_t size, ierror_t *error);
http | La sesión HTTP. |
path | Dirección del recurso. |
data | Datos para añadir en el cuerpo de la petición. Puede ser |
size | Tamaño en bytes del bloque de datos. |
error | Código de error si la función falla. Puede ser |
Retorna
TRUE
si la petición se ha llevado a cabo correctamente. Si FALSE
, en error
tendremos la causa.
Observaciones
Ver http_get.
http_response_status ()
Devuelve el código de respuesta de una petición HTTP.
uint32_t http_response_status(const Http *http);
http | La sesión HTTP. |
Retorna
El código de respuesta del servidor.
http_response_protocol ()
Devuelve el protocolo utilizado por el servidor HTTP.
const char_t* http_response_protocol(const Http *http);
http | La sesión HTTP. |
Retorna
El protocolo del servidor.
http_response_message ()
Devuelve el mensaje de respuesta del servidor HTTP.
const char_t* http_response_message(const Http *http);
http | La sesión HTTP. |
Retorna
El mensaje de respuesta del servidor.
http_response_size ()
Devuelve el número de cabeceras de respuesta de una petición HTTP.
uint32_t http_response_size(const Http *http);
http | La sesión HTTP. |
Retorna
El número de cabeceras.
http_response_name ()
Devuelve el nombre de la cabecera de respuesta de una petición HTTP.
const char_t* http_response_name(const Http *http, const uint32_t index);
http | La sesión HTTP. |
index | El índice de la cabecera (0, size-1). |
Retorna
El nombre de la cabecera.
http_response_value ()
Devuelve el valor de la cabecera de respuesta de una petición HTTP.
const char_t* http_response_value(const Http *http, const uint32_t index);
http | La sesión HTTP. |
index | El índice de la cabecera (0, size-1). |
Retorna
El valor de la cabecera.
http_response_header ()
Devuelve el valor de una cabecera de respuesta de una petición HTTP.
const char_t* http_response_header(const Http *http, const char_t *name);
http | La sesión HTTP. |
name | El nombre de la cabecera deseada. |
Retorna
El valor de la cabecera. Si la cabecera no existe, devolverá una cadena vacía ""
.
http_response_body ()
Devuelve el cuerpo de la respuesta de una petición HTTP.
bool_t http_response_body(const Http *http, Stream *body, ierror_t *error);
http | La sesión HTTP. |
body | Stream de escritura donde se almacenará el contenido de la respuesta. |
error | Código de error si la función falla. Puede ser |
Retorna
TRUE
si se ha podido leer correctamente. Si FALSE
, en error
tendremos la causa.
http_dget ()
Realiza una petición directa de un recurso Web.
Stream* http_dget(const char_t *url, uint32_t *result, ierror_t *error);
1 2 3 4 5 6 |
url | URL del recurso. |
result | Código de respuesta del servido. Puede ser |
error | Código de error si la función falla. Puede ser |
Retorna
Stream con el resultado de la petición.
Observaciones
Utiliza esta función para el acceso directo a un recurso aislado. Si necesitas realizar varias peticiones o configurar las cabeceras, utiliza http_create o http_secure.
http_exists ()
Chequea si un recurso Web está disponible/accesible.
bool_t http_exists(const char_t *url);
url | URL del recurso. |
Retorna
TRUE
si el recurso (página Web, archivo, etc) está accesible.
Observaciones
No se resuelven las redirecciones HTTP. Retornará FALSE
si la URL tal cual no es válida.