Ejecución de consultas en OrionX desde Java

En este tutorial se desarrolla una solución en Java para que cualquiera pueda hacer consultas sobre la API de OrionX desde cualquier máquina conectada a internet.

No están todas las consultas disponibles en la plataforma API, sólo las básicas. Con ello aprenderás a manejarte con la API de OrionX en GraphQL para comenzar con tus desarrollos. En este tutorial se expone la base del desarrollo del cliente que consume la API de OrionX.

Prerequisitos

Para poder ejecutar el programa, debes primero tener un compilador de Java. Recomiendo descargar la última versión disponible de Eclipse o bien de NetBeans.

Ya que Java es un lenguaje Multiplataforma, no hay escusas par no poder ejecutar el software. Esta característica, te permitirá correrlo en Windows, en MAC, obviamente en GNU/Linux y practicamente en cualquier dispositivo.

Obtención de código

Para obtener el código fuente, puedes descargarlo directamente Aquí o hacer clone al repositorio.

$ git clone https://github.com/panterozo/API2-OrionX.git

Trabajando con Eclipse

Una vez descargado, debes importar el proyecto dentro del IDE descargado anteriormente. En mi caso, utilizaré Eclipse.

Al abrir Eclipse, debes ir al menú principal y dar click en Archivo => Importar.... Esto desplegará un conjunto de opciones. En ellas, tienes que indicarle que importarás desde un proyecto existente, tal como se muestra en la imagen:

Luego, seleccionas la carpeta donde descargaste el proyecto:

  • Importante: Si descargaste el archivo .zip, debes descomprimirlo para poder realizar la importación dentro de Eclipse.

Si todo salió bien hasta este punto, debería haberse importado correctamente el proyecto y deberías ver las clases como en la siguiente imagen:

Ahora es momento de incluir tus KEYS creadas en OrionX. Si aún no lo has hecho, puedes seguir este tutorial. Debes incluir las llaves en el código siguiente para que puedas realizar consultas en OrionX:

user.setApiKeyPublic("AQUI TIENES QUE PONER TU API KEY");
user.setSecretKey("AQUI TIENES QUE PONER TU SECRET KEY");

Debes incluir tus KEYS en el código, de tal manera que quede así:

user.setApiKeyPublic("ERssdrbrajh8o6a744fdVFvdfvSPYPqz");
user.setSecretKey("WsdKztw9CcnnYrOM8SExKSN5sqiEr5hw9P");

Ahora podrás ejecutar el programa sin problemas. Para ello, debes clickear con el botón derecho del mouse sobre la clase OrionXBase.java, y seleccionar Run As... Java Application, como se muestra en la imagen abajo.

Con la ejecución, deberías obtener los resultados en la consola de Eclipse.

Con la ejecución del programa acabamos de obtener tus datos personales, el valor mercado, el libro de órdenes, la información de tu wallet y las estadísticas por hora.

Código

En el código encontrarás tres clases, Operations, OrionXBase y User.

  • Clase Operations: Esta clase genera los elementos JSON que serán enviados por método POST a la API de OrionX

  • Clase User: Esta clase es utilizada para guardar los datos del dueño de la KEY que se utilizó para logearse

  • Clase OrionXBase: Esta clase es donde comienza el programa, y contiene el método main()

Internamente, se hace un ciclo para que vaya una a una realizando las operaciones en la API. Así podrás ver diferentes implementaciones para lo que necesites.

for(int i=0; i<5; i++){
  /*Se genera objeto JSON a enviar*/
  String type = "";
  switch(i){
    case 0:
      type="Me";
      operaciones.Me();
      break;
    case 1:
      type="Market";
      operaciones.Market(marketCode);
      break;
    case 2:
      type="MarketBook";
      operaciones.MarketBook(marketCode);
      break;
    case 3:
      type="UserWallet";
      operaciones.UserWallet();
      break;
    case 4:
      type="MarketStats";
      /*Se obtiene la estadística por hora.*/
      operaciones.MarketStats(marketCode, "h1");
      break;
  }

Cada vez que ingresa al ciclo, se genera un header nuevo por cada llamada, de la siguiente manera:

String url = "https://api2.orionx.io/graphql";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
			
/*Se setea la información de User-Agent*/
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
/*Se genera timestamp*/
long value = new Date().getTime();
String timestamp = String.valueOf(value);
/*Se genera el valor del header con el objeto, timestamp y tu secret key*/
String apiKeySignature = getHeaderApi2(timestamp,jsonObject,secretKey);
/*apiKeySignature contiene el valor encriptado*/
apiKeySignature = apiKeySignature.toLowerCase();/*Se pasa a minúsculas*/
/*Se setean los valores del header*/
con.setRequestProperty("X-ORIONX-TIMESTAMP", timestamp);
con.setRequestProperty("X-ORIONX-APIKEY", apiKeyPublic);
con.setRequestProperty("X-ORIONX-SIGNATURE", apiKeySignature);

El método encargado de la encriptación del mensaje es getHeaderApi2:

public static String getHeaderApi2(String timestamp, JSONObject jsonObject, String privateKey){
    Mac sha512_HMAC = null;
    String result = null;
    /*Se concatena el timestamp con el objeto a enviar*/
    String mesagge=timestamp+jsonObject;

    try{
        byte [] byteKey = privateKey.getBytes("UTF-8");
        final String HMAC_SHA512 = "HmacSHA512";
        sha512_HMAC = Mac.getInstance(HMAC_SHA512);
        SecretKeySpec keySpec = new SecretKeySpec(byteKey, HMAC_SHA512);
        sha512_HMAC.init(keySpec);
        byte [] mac_data = sha512_HMAC.doFinal(mesagge.getBytes("UTF-8"));
        result = bytesToHexForApi2(mac_data);
    }catch (Exception e){

    }
    return result;
}

No se hace necesario abordar a fondo el cómo de la encriptación. Si quieres abordar este problema, puedes ver el siguiente tutorial realizado por @itolosa.

Sobre Mí

Mi nombre es Ignacio Álvarez Arenas, y soy un apasionado por la tecnología y soluciones innovadoras. Espero puedas utilizar sin problemas el código fuente, y ante cualquier duda o consulta, puedes contactarme conmigo y te responderé a la brevedad.

Te dejo mis wallets en caso que te animes a aportarme con criptomonedas. Te agradezco profundamente cualquier aporte, por mínimo que sea.

Chaucha: ceoNBCv1JF6GgeAhsFLk6efbRkCX5n8kZn

Bitcoins: 1CWpA2XnFnfTnbAJN94MpQWyunJgoKYz8K

Ethereum: 0x9f2688B1a76CC24dA8610E90767c319fb2EA2Af0

Ripple: rhQrkgoV4uza557mW6HbBWMtTDkB7u5yrs

Litecoin: LVBocBQpqD7FrXiUNrAtrkQtw1JdG6CBQt

Bitcoin Cash: 14X2cEXpT6BLhFtFhYizCdUgoKtAXede4Z

Dash: XytqZKeKyMgG1k5meGocmtGGgPnqH7kRiM

También puedes revisar mis otros proyectos por aquí o por acá.

Happy hacking!