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);
}
}
}