Milk News

26 Maio, 2008

Como fazer uma chamada HTTPS

Arquivado em: Google, Java, Nerdices — Marcelo @ 1:27 am

Coisa mais comum em programação é ter que consultar algum sistema legado em uma interface HTTP. Não estou falando de Webservices ou qualquer coisa mais moderininha, mas simplemente fazer uma chamada HTTP a seja lá o que for. Desde a JDK 1.4 (se não me engano), temos a classe java.net.URL, que facilitou um bocado as coisas.

Mas…e quando se tratar de uma chamada a um servidor seguro (https) ?

Aí a coisa complica mais para quem é leigo e nunca estudou a fundo o protocolo HTTP.
Importar certificados, checar se o mesmo é válido e outras coisinhas que para explicar direito, teria que falar sobre alguns conceitos de como funciona o HTTPS. Mas, se você não está interessado em nada disso (se está aqui, eu acredito que não esteja) e confia no endereço que está chamando, sem checar certificados e validade das chaves, copie a classe Java abaixo.

Eu aceito postais como pagamento :)

package com.milknews.examples;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.log4j.Logger;

/**
 * Makes a HTTPS call and returns the content as string
 *
 * @author milknews.wordpress.com
 *
 */
public class HTTPSCaller {

    private static final Logger log = Logger.getLogger("com.milknews.examples.HTTPSCaller");

    /**
     * @param args
     */
    public static void main(String[] args) {
	String url = "https://example-to-https-site:8080";

	System.out.println(httpsCaller(url, "put the postdata here", 1000));
    }

    /**
     * httpsCaller
     *
     * @param URL
     * @param data
     * @param timeout
     */
    private static String httpsCaller(String URL, String data, int timeout) {
	log.info("[httpsCaller] called, URL: " + URL + " data: " + data
	        + " timeout " + timeout);
	String httpResponse = "";
	try {
	    URLConnection conn;
	    URL url = new URL(URL);
	    acceptSSL();
	    conn = url.openConnection();
	    conn.setReadTimeout(timeout);
	    conn.setDoOutput(true);
	    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
	    wr.write(data);
	    wr.flush();
	    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	    String line;
	    while ((line = rd.readLine()) != null) {
		httpResponse = httpResponse + "\n" + line;
	    }
	    wr.close();
	    rd.close();
	} catch (IOException e) {
	    log.fatal("[httpsCaller] IOException", e);
	    e.printStackTrace();
	}
	httpResponse.replace("\n", "");
	httpResponse = httpResponse.trim();

	log.info("[httpsCaller] response is: " + httpResponse);
	return httpResponse;
    }

    /**
     * acceptSSL
     */
    private static void acceptSSL() {
	// Create a trust manager that does not validate certificate chains
	TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
	    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
		return null;
	    }

	    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {

	    }

	    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {

	    }
	}

	};

	// Install the all-trusting trust manager
	try {
	    SSLContext sc = SSLContext.getInstance("SSL");
	    sc.init(null, trustAllCerts, new java.security.SecureRandom());
	    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	} catch (Exception e) {
	    log.fatal("[Exception]", e);
	}
    }

}

Sem comentários ainda »

Nenhum comentário ainda.

Feed RSS dos comentários deste post URI do TrackBack

Deixe um comentário

Blog no WordPress.com.