Automatic API REST - Conector Python

Hola a todos, no se si recordáis el proyecto que se creo en Geeky Theory hace aproximadamente un año llamado Automatic API REST [AAR], el cual aún sigue en desarrollo. Pues bien, hace unos días me entretuve un rato y creé un conector en python que permitiera abstraer la lógica de Automatic API REST y permitiera obtener de manera sencilla datos de una base de datos mediante el uso de esta herramienta.

¿Qué es Automatic API REST?

Para los que no sepáis que es Automatic API REST os dejo unos cuantos enlaces que os ayudará a comprende y usar esta herramienta, que básicamente os permitirá crear API REST de tu base de datos en segundos.

Conector Python

Una vez que hemos recordado qué es y para qué sirve Automatic API REST, vamos a ver cómo obtener los datos de nuestra base de datos a traves de la API creada en python. Para ello vamos a crear un conector que básicamente será una clase en python que haga uso de llamadas HTTP tipo GET o POST para obtener los datos de nuestra base de datos. Así pues, nuestro conector tendrá la siguiente forma:

class AARConnector: def __init__(self,**kwargs): self.url = kwargs.get("url","") self.domain = kwargs.get("domain","http://automaticapirest.info/demo/") self.table = kwargs.get("table","") self.columns = kwargs.get("columns","") self.orderby = kwargs.get("orderby","") self.way = kwargs.get("way","ASC") self.limit = kwargs.get("limit","") self.where = kwargs.get("where","") self.opt = kwargs.get("opt","") if(self.url == ""): print(self.formatURL()) self.url = self.formatURL() def getRawData(self): url = self.url request = urllib.request.Request(url) response = urllib.request.urlopen(request) jsonraw = response.read().decode('utf-8') return jsonraw def getJson(self): jsonraw = self.getRawData() data = json.loads(jsonraw) return data def printJson(self): jsonobject = self.getJson() print(json.dumps(jsonobject, indent=1, sort_keys=True)) def getData(self): return self.getJson()["data"] def printData(self): data = self.getData() print(json.dumps(data, indent=1, sort_keys=True)) def getDBInfo(self): return self.getJson()["dbInfo"] def printDBInfo(self): dbinfo = self.getDBInfo() print(json.dumps(dbinfo, indent=1, sort_keys=True)) def formatURL(self): url = self.domain+"getData.php?t="+self.table if(self.columns != ""): url = url+"&c="+self.columns if(self.orderby != ""): url = url+"&o="+self.orderby if(self.way != "ASC"): url = url+"&s="+self.way else: url = url+"&s=ASC" if(self.limit != ""): url = url+"&l="+self.limit if(self.where != ""): url = url+"&w="+urllib.parse.quote(self.where) if(self.opt != ""): url = url+"&opt="+self.opt return url

Enlace a Github

Podemos observar que el constructor de la clase AARConnector acepta como parámetros de entrada un "set" de variables que nos permitirá definir la consulta que queremos hacer a nuestra API, la cual nos devolverá los datos en formato JSON.

Las funciones definidas en esta clase nos va a permitir parsear la consulta, proceder a la llamada a la API y devolver los resultados.

Ejemplo de uso

Para ver un ejemplo de uso, vamos a usar la instancia de Automatic API REST que tenemos en la demo de la página oficial automaticapirest.info. Así pues si por ejemplo abrimos nuestro navegador e insertamos el siguiente link:

http://automaticapirest.info/demo/getData.php?t=Country&c=Code,Name&l=0,5 Obtendremos los últimos 5 valores de la columna "Code" de la tabla "Country" en formato JSON: {"data":[{"0":"ABW","Code":"ABW","1":"Aruba","Name":"Aruba"},{"0":"AFG","Code":"AFG","1":"Afghanistan","Name":"Afghanistan"},{"0":"AGO","Code":"AGO","1":"Angola","Name":"Angola"},{"0":"AIA","Code":"AIA","1":"Anguilla","Name":"Anguilla"},{"0":"ALB","Code":"ALB","1":"Albania","Name":"Albania"}],"dbInfo":["Code","Name"]} El objetivo de nuestro conector es abstraer la comunicación entre nuestro python script y nuestra base de datos a través de llamadas a nuestra API creada por Automatic API REST. Para facilitar el uso del conector he creado un módulo en pip llamado aarpy para que nos sea más fácil trabajar con este conector. Así pues, para usar el conector, lo primero que vamos a hacer es instalar el modulo que hemos creado mediante pip:pip install aarpy A continuación vamos a ver lo fácil que es usar este módulo en python, y obtener los datos que queramos. __author__ = 'Alejandro Esquiva Rodriguez' from aarpy.AARConnector import AARConnector #AAR Instance ##Create instance via URL AAR = AARConnector(url="http://automaticapirest.info/demo/getData.php?t=Country&c=Code,Name&l=0,5") ##Create instance via parameters #AAR = AARConnector(domain="http://automaticapirest.info/demo/",table="Country",columns="Name",orderby="Name",limit="10",where="Name:'Albania'") #Get all the json jsondata = AAR.getJson() ''' print(jsondata) ########################## {'dbInfo': ['Code', 'Name'], 'data': [{'1': 'Aruba', 'Code': 'ABW', '0': 'ABW', 'Name': 'Aruba'}, {'1': 'Afghanistan', 'Code': 'AFG', '0': 'AFG', 'Name': 'Afghanistan'}, {'1': 'Angola', 'Code': 'AGO', '0': 'AGO', 'Name': 'Angola'}, {'1': 'Anguilla', 'Code': 'AIA', '0': 'AIA', 'Name': 'Anguilla'}, {'1': 'Albania', 'Code': 'ALB', '0': 'ALB', 'Name': 'Albania'}]} ''' #Get all the data data = AAR.getData() #Get query info dbinfo = AAR.getDBInfo() #Output a specific data #Name in the first row name = data[0]["Name"] #OR name = data[0]["0"] print(name) #Print query info AAR.printDBInfo() ''' [ "Code", "Name" ] ''' #Print Data AAR.printData() ''' [ { "0": "ABW", "1": "Aruba", "Code": "ABW", "Name": "Aruba" }, { "0": "AFG", "1": "Afghanistan", "Code": "AFG", "Name": "Afghanistan" }, { "0": "AGO", "1": "Angola", "Code": "AGO", "Name": "Angola" }, { "0": "AIA", "1": "Anguilla", "Code": "AIA", "Name": "Anguilla" }, { "0": "ALB", "1": "Albania", "Code": "ALB", "Name": "Albania" } ] '''

Enlace a Github

Así pues, si observamos el script, nos hemos creado una instancia de la clase AARConnector que está dentro del módulo aarpy. Los parámetros de entrada de la instancia los podemos poner o bien mediante una URL válida o bien describiendo parámetro a parámetro la consulta.

Una vez que tenemos la instancia, podemos llamar a varias funciones que hemos implementado, por ejemplo, podemos llamar a la función getJSON, la cual nos devolverá el JSON en raw de la consulta.

Por otro lado, podemos ejecutar la consulta con la función getData la cual nos devolverá un array multidimensional con la información de la consulta, de esta manera no hace falta parsear el JSON, tan solo tenemos indexando un array multidensional.

Otra función implementada es la función getDBInfo, esta función nos devuelve información de la consulta realizada, como por ejemplo, los campos que hemos seleccionado. Finalmente, las funciones printData y printDBInfo nos muestra en pantalla el JSON en forma de árbol.

Y esto es todo, espero que os haya gustado este conector para Automatic API REST, os animo a que participéis en el proyecto, enviar todos los pull request oportunos o incluso si estáis insteresados en participar de forma activa, enviarme un email a alejandro@geekytheory.com.