This is a follow-up post to an older thread on Notes.net. Configuring SSL and reading from remote locations can be a headache… unless you stand on shoulders of giants. Here are the steps that worked for me. While they are designed for R7 upwards with a JVM 1.4++ they also will work in R6 with the optional SUN SSL packages (just read the older post for configuration).
Update: The class didn’t process HTTPPost correctly, so I updated the code, changes in bold.
What do you need:
-
Apache Commons HTTP Client
-
Apache Logging library (and codecs)
-
EasySSL Classes (EasySSL, EasyTrustManager)
Once you have that a few simple lines of code will do. Note: you don’t even need to configure SSL (but you SHOULD understand the security implications of NOT configuring it).
Here is the class:
/**
-
(C) 2007 Stephan H. Wissel
-
This code is for demonstration purposes only and no assertion
-
is made about the fitness or reliability for any business purpose
*/
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
public class HttpsCommonFetcher {
/** Log object for this class. */
private static final Log LOG = LogFactory.getLog(HttpsCommonFetcher.class);
public String getContentFromHTTP(String xRequest, String targetURL; String method) {
String result = null;
HttpMethod httpMethod = null;
// This implementation uses the HTTP Common client from the
// Apache jakarta Project. See: http://jakarta.apache.org/httpcomponents/index.html
// and http://jakarta.apache.org/commons/httpclient/sslguide.html
// We use the EasySSL Implementation to avoid SSL configuration stress
String hostwithoutSSL = this.targetURL.substring(8);
LOG.info(hostwithoutSSL);
// We use the simple SSL methods that doesn't compare with the keystore remove the 2 lines if you intend to config SSL
Protocol myhttps = new Protocol("https",
new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
HttpClient httpclient = new HttpClient();
// Here would be the optional Proxy code
// httpclient.getHostConfiguration().setProxy(pHost, pPort);
if (method.qualsIgnoreCase("POST")) {
// We only support get and post and if it is not POST it is GET
PostMethod pm = new PostMethod(this.targetURL);
// Populate the body of the request
RequestEntity entity = new StringRequestEntity(xRequest);
pm.setRequestEntity(entity);
httpMethod = (HttpMethod) pm;
} else {
httpMethod = new GetMethod(this.targetURL);
}
// Make sure we follow eventual redirects
httpMethod.setFollowRedirects(true);
// Now we retrieve the stuff
try {
int statusCode = httpclient.executeMethod(httpMethod);
// Here we have the result already
LOG.info(httpMethod.getStatusLine());
if (statusCode == HttpStatus.SC_OK) {
// Directly read it into a String ... creates a warning in
// HTTPClient but is what we would do anyway.
result = httpMethod.getResponseBodyAsString();
} else {
result = "<error>" + httpMethod.getStatusLine() + "</error>";
}
} catch (HttpException e) {
LOG.error(e);
} catch (IOException e) {
LOG.error(e);
} finally {
httpMethod.releaseConnection();
}
return result;
}
}