Integración Java+Azure utilizando REST
Cuando escuchamos de Azure, inmediatamente se nos viene a la mente el SDK de esta interesante plataforma de Microsoft, sin embargo algunos desarrolladores preferimos invocar a los servicios de Azure directamente desde su API REST, sin utilizar bibliotecas específicas. En este artículo encontrarás un ejemplo completo de cómo comunicarnos con Azure Blob Storage.
A continuación, se muestra la clase java que se encarga de realizar la comunicación:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
*
* @author Rolando
*/
public class Util {
private static Base64 base64 = new Base64();
public static void signRequestSK(HttpURLConnection request, String account, String key) throws Exception {
SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";
StringBuilder sb = new StringBuilder();
sb.append("GET\n"); // method
sb.append("\n"); // content encoding
sb.append("\n"); // content language
sb.append("\n"); // content length
sb.append("\n"); // md5 (optional)
sb.append("\n"); // content type
sb.append("\n"); // legacy date
sb.append("\n"); // if-modified-since
sb.append("\n"); // if-match
sb.append("\n"); // if-none-match
sb.append("\n"); // if-unmodified-since
sb.append("\n"); // range
sb.append("x-ms-date:" + date + "\n"); // headers
sb.append("x-ms-version:2015-12-11\n");
sb.append("/" + account + request.getURL().getPath() + "\ncomp:list");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
String authKey = new String(base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
String auth = "SharedKey " + account + ":" + authKey;
request.setRequestProperty("x-ms-date", date);
request.setRequestProperty("x-ms-version", "2015-12-11");
request.setRequestProperty("Authorization", auth);
request.setRequestProperty("Accept-Charset", "UTF-8");
request.setRequestProperty("Accept", "application/atom+xml,application/xml");
request.setRequestMethod("GET");
}
public static void main(String args[]) throws Exception {
//To use fiddler
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyPort", "8888");
//--
//Inputs
String account = "<Nombre_Cuenta>";
String key = "<Access_Key>";
//--
HttpURLConnection connection = (HttpURLConnection) (new URL("http://" + account + ".blob.core.windows.net/?comp=list")).openConnection();
signRequestSK(connection, account, key);
connection.connect();
StringBuffer text = new StringBuffer();
InputStreamReader in = new InputStreamReader((InputStream) connection.getContent());
BufferedReader buff = new BufferedReader(in);
String line;
do {
line = buff.readLine();
text.append(line + "\n");
} while (line != null);
System.out.println(text);
}
}
Entonces, si utilizamos Fiddler, podremos ver que este sería el Request:
GET http://"<Nombre_Cuenta>".blob.core.windows.net/?comp=list HTTP/1.1 x-ms-date: Wed, 26 Oct 2016 18:35:49 GMT x-ms-version: 2015-12-11 Authorization: SharedKey "<Nombre_Cuenta>":psyT2FlwpU3BU7/kKqtfi+ZBTuUpEX8bnsZ45O/1rUk= Accept-Charset: UTF-8 Accept: application/atom+xml,application/xml User-Agent: Java/1.8.0_92 Host: "<Nombre_Cuenta>".blob.core.windows.net Connection: keep-aliveY el response quedaría de la siguiente manera:
<?xml version="1.0" encoding="UTF-8" ?>
<EnumerationResults ServiceEndpoint="http://"<Nombre_Cuenta>".blob.core.windows.net/">
<Containers>
<Container>
<Name>sas</Name>
<Properties>
<Last-Modified>Tue, 25 Oct 2016 19:19:46 GMT</Last-Modified>
<Etag>"0x8D3FD0BE1F7E8D0"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
</Containers>
<NextMarker />
</EnumerationResults>

Comentarios
Publicar un comentario