Creando Clientes [Vala y Gtk 3]

Normalmente en linux echamos en falta bastantes aplicaciones, o clientes de algunos servicios que salen mucho antes para otras plataformas, pues en este tutorial veremos como crear un cliente (será una visión muy por encima) , mediante el uso de API REST con vala (y gtk 3).

API

No voy a explicar ni que es una API, ni cual es la API REST (podéis encontrar mucha información en google), solo diré que a groso modo haremos unas peticiones (GET o POST) y nos devolverá una respuesta en formato JSON.

Para el tutorial he decidido usar la api que nos proporciona Marvel (ver documentación de la api) , la cual nos proporciona una serie de información sobre cómics, personajes …

Para acceder a ella necesitamos una llave, que podemos obtener registrándonos, una vez obtenida tenemos un limite de 3000 peticiones.

Vamos a ver un ejemplo de la API, para llamar a dicha api tenemos que hacer uso de nuestras llaves (tenemos una publica y otra privada) :

Para ver este sencillo ejemplo podemos usar www.md5.net donde ponemos 1 “+” keyprivate “+” keypublic y que nos genere el hash, podemos llamar como pone en la imagen. Obtendremos como respuesta (en este caso es para ver los personajes) :

hay un error en la imagen la llamada seria http://gateway.marvel.com/v1/public/comics …

Hay programas y plugins para navegadores que nos facilitaran la vista de json:

Podemos ver que nos da el nombre, la descripción un thumbnail (imagen del personaje) …

web desarrollo marvel

Tratando JSON con vala (Parseando).

Tampoco explicare que son los formatos json, podéis encontrar información por Internet. Podemos encontrar un ejemplo sencillo echo en Vala aquí.

Primero de todo instalamos la libreria json-glib en caso de que no la tengamos instalada:

sudo apt-get install libjson-glib-1.0-0 libjson-glib-1.0-0-dev

También instalaremos libsoup:

sudo apt-get install libsoup-2.4 libsoup2.4-dev
No pondré ni la llave publica ni el hash a las peticiones

Primero de todos importamos las librerías que usaremos:

using Soup;
using Json;
using Gtk;

Enviando una petición:

var uri = "http://gateway.marvel.com/v1/public/comics?dateRange=2014-16-03%2C2014-16-03&orderBy=-onsaleDate&limit=10&ts=1&apikey=123&hash=555224458";
var session = new Soup.SessionSync ();
var message = new Soup.Message ("GET", uri);
session.send_message (message);

La url nos mostrara como máximo 10 cómics que han salido entre 2 datas (00-03-2014 , 16-03-2014).
Primero de todo creamos una sesión, luego construimos la petición del tipo GET y la enviamos.

Parseando json:

var root_object = parser.get_root ().get_object ();

obtiene el objeto principal, es decir, todo el código json.

var response = root_object.get_object_member ("data");
var results = response.get_array_member ("results");

Podemos coger

Procesar el código:

foreach (var geonode in results.get_elements ()) {

var geoname = geonode.get_object ();

stdout.printf ("%f\n%s\n%s\n\n",

geoname.get_string_member ("id"),

geoname.get_string_member ("name"),

geoname.get_double_member ("description"));

}

Podéis ver ejemplos aquí.

Mostrando la información:

Aquí ya entra a nuestro gusto como mostrar la información , para bajar las imágenes podemos usar este método:

public static async Gdk.Pixbuf? get_img (string url) {
Gdk.Pixbuf? pix = null;
var file = File.new_for_uri (url);
try {
GLib.InputStream @input_stream = yield file.read_async (Priority.DEFAULT, null);
pix = yield new Gdk.Pixbuf.from_stream_at_scale_async (input_stream, 800, 600, true, null);
} catch (Error e) {
warning (e.message);
}
return pix;
}

Al ser un método que es ejecutado en otro thread (asíncrono) al llamarlo tenemos que hacerlo de esta forma:

get_img.begin (img_url, (obj, res) => {
var pix = get_img.end (res);
});

Donde img_url és la url de la imagen que obtenemos del json.

Para compilar aremos:

valac --pkg gtk+-3.0 --pkg libsoup-2.4 --pkg json-glib-1.0 nombreCliente.vala
Podemos encontrar documentación para json-glib aquí.

Tips

Algunos Tips que nos pueden servir para crear nuestro cliente/aplicación:

AppIndicator

AppIndicator es una librería que nos permite poner nuestro programa como un indicador en el panel superior (tanto en Elementary os como en Ubuntu).

Instalando appindicator3-0.1

sudo apt-get install libappindicator3-dev

Compilando:

valac --pkg gtk+-3.0 --pkg appindicator3-0.1 programa.vala

En caso que os de un error puede ser por que tengáis una versión más nueva de appindicator, en ese caso dirigios a /usr/share/vala/vapi y veréis cual es vuestra versión.

Podemos encontrar un ejemplo en la web de desarrollo de Ubuntu.

Un pequeño ejemplo:

 

var indicator = new Indicator("win.title", "office-address-book", IndicatorCategory.APPLICATION_STATUS);

indicator.set_status(IndicatorStatus.ACTIVE);

var menu = new Gtk.Menu();
var item = new Gtk.MenuItem.with_label("Añadir nuevo contacto");
item.activate.connect(() => {
//indicator.set_status(IndicatorStatus.ATTENTION);
//CrearContacto();
});
item.show();
menu.append(item);

item = new Gtk.MenuItem.with_label("Borrar contacto");
item.show();
item.activate.connect(() => {
//indicator.set_status(IndicatorStatus.ATTENTION);
//BorrarContacto();
});
menu.append(item);
indicator.set_menu(menu);

Imágenes

Poner un icono en nuestra aplicación:

Partimos del constructor de la clase Gtk.Window:

try {
// Directorio de la imagen
this.icon = new Gdk.Pixbuf.from_file ("fcbb.png");
} catch (Error e) {
stderr.printf ("error: %s\n", e.message);
}

 

Imagen simple

Una simple imagen en vala que podemos poner por ejemplo en algún layout.

image = new Gtk.Image ();
image.set_from_file ("fcb.png");

Opinión

Usar vala y gtk para clientes? no, desde mi punto de opinión es mucho mejor y más fácil usar c++ y Qt (QML), queda pendiente hacer un articulo para hacer clientes en QML.

Comparte para difundir

Si te ha gustado nuestro contenido ahora puedes ayudar a difundirlo en las redes sociales de manera sencilla usando los siguientes botones:

Envía
Pinea
Print

2 comentarios

  1.   marcos dijo

    gracias carnal 😀 , es grandioso ver lo que puede hacer unas “cuantas lineas de codigo” cundo se tiene conocimiento. el ejemplo da muchas ideas para otras cosas 😀

  2.   eliotime3000 dijo

    Muy buenos tips, bro.

    A ver si logro hacer uno.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.