Peticiones http desde PostgreSQL

Hola a todos, pues si como se lee en el título de la entrada, hacer peticiones http desde dentro del motor de base de datos de código abierto más avanzado del mundo es posible, y todo gracias al mecanismo de extensiones que posee PostgreSQL, del cual ya he dicho que soy FAN. Que podemos hacer un un cliente http desde dentro de PostgreSQL, pues hacer peticiones WEB a sitios o servicios  restful, etc. Por ejemplo, puede que necesitemos hacer desde el motor la descarga de un sitio web para su posterior procesamiento y simplemente leer un JSON que retorna una petición restful. Para todo esto se puede utilizar la extensión pgsql-http, desarrollada por Paul Ramsey, que también tiene otras contribuciones a PostgreSQL.

Pues manos a la obra, instalaremos y probemos que talSe descarga de aquí y se instala (este ejemplo es Centos 7.2 y PostgreSQL 9.6)


Instalamos dependencias:
yum install postgresql96-devel libcurl-devel
Se exporta el PAHT del pg_config para que al compilar se vea las biblioteca
export PATH=$PATH:/usr/pgsql-9.6/bin/

Compilamos e instalamos:
make
make install

Dicha extensión posee 7 funciones para hacer peticiones:

  • http_header(field VARCHAR, value VARCHAR) returns http_header
  • http(request http_request) returns http_response
  • http_get(uri VARCHAR) returns http_response
  • http_post(uri VARCHAR, content VARCHAR, content_type VARCHAR) returns http_response
  • http_put(uri VARCHAR, content VARCHAR, content_type VARCHAR) returns http_response
  • http_delete(uri VARCHAR) returns http_resonse
  • urlencode(string VARCHAR) returns text

Se crea la extensión y a utilizarla con algunos ejemplos:


http=# create extension http;

--Por ejemplo para descargar un  sitio y almacenarlo en /tmp, para su posterior procesamiento
COPY (select content from http_get('http://www.google.com')) TO '/tmp/google.html';

--Para los siguientes ejemplo se utilizó un servidor con couchDB
--preguntar el header de un sitio
http=# select (unnest(headers)) as header from http_get('http://xxxxxxxxxx:5984/');
header
----------------------------------------------
(Server,"CouchDB/1.5.0 (Erlang OTP/R16B03)")
(Date,"Tue, 11 Oct 2016 14:27:56 GMT")
(Content-Type,"text/plain; charset=utf-8")
(Content-Length,127)
(Cache-Control,must-revalidate)
(5 filas)

--preguntar  el status y tipo de content

http=# select status,content_type from http_get('http://xxxxxxxxxx:5984/');
status | content_type
--------+---------------------------
200 | text/plain; charset=utf-8
(1 fila)

--petición get con retorno de un JSON, usando los mecanismos de parseo de JSON PostgreSQL
http=# select content::json->'version' as couchdb_version, content::json->'vendor'->'name' as SO, content::json->'vendor'->'version' so_version from http_get('http://xxxxxxxxxx:5984/');
couchdb_version | so | so_version
-----------------+----------+------------
"1.5.0" | "Ubuntu" | "14.04"
(1 fila)
--petición PUT, agregando una nueva BBDD
http=# SELECT status,content FROM http_put('http://xxxxxxxxxx:5984/albums', '', 'text/plain');
status | content
--------+-------------
201 | {"ok":true}+
|

--listado las BBDD del servidor couchDB

http=# select content from http_get('http://xxxxxxxxxx:5984/_all_dbs');
content
-----------------------------------
["_replicator","_users","albums"]+

--haciendo petición DELETE, eliminando la BBDD creada anteriormente
http=# SELECT status,content FROM http_delete('http://192.112.10.188:5984/albums');
status | content
--------+-------------
200 | {"ok":true}+
|
(1 fila)

 

Como ven se puede hacer varias actividades con esta extensión, de seguro usted podrá encontrarle otros usos, todo depende de las necesidades que se tengan, pero puede ser muy útil para interactuar con la WEB desde dentro de PostgreSQL.

 

Nos vemos en otra 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s