How to execute a https GET request from java

53,151

Solution 1

I developed a solution which looks easier that what has been posted here

private String executeGet(final String https_url, final String proxyName, final int port) {
    String ret = "";

    URL url;
    try {

        HttpsURLConnection con;
        url = new URL(https_url);

        if (proxyName.isEmpty()) {  
            con = (HttpsURLConnection) url.openConnection();
        } else {                
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyName, port));
            con = (HttpsURLConnection) url.openConnection(proxy);
            Authenticator authenticator = new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                        return (new PasswordAuthentication(USERNAME, PASSWORD.toCharArray()));
                    }
                };
            Authenticator.setDefault(authenticator);
        }

        ret = getContent(con);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return ret;
}

Solution 2

this is my quick and dirty https client in Java, that ignores invalid certificates and authenticates using BASIC

import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

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

    public static HttpsURLConnection getConnection(boolean ignoreInvalidCertificate, String user, String pass, HttpRequestMethod httpRequestMethod, URL url) throws KeyManagementException, NoSuchAlgorithmException, IOException{
        SSLContext ctx = SSLContext.getInstance("TLS");
        if (ignoreInvalidCertificate){
            ctx.init(null, new TrustManager[] { new InvalidCertificateTrustManager() }, null);  
        }       
        SSLContext.setDefault(ctx);

        String authStr = user+":"+pass;
        String authEncoded = Base64.encodeBytes(authStr.getBytes());

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.setRequestProperty("Authorization", "Basic " + authEncoded);     

        if (ignoreInvalidCertificate){
            connection.setHostnameVerifier(new InvalidCertificateHostVerifier());
        }

        return connection;
    }

--

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

public class InvalidCertificateHostVerifier implements HostnameVerifier{
    @Override
    public boolean verify(String paramString, SSLSession paramSSLSession) {
        return true;
    }
}

--

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

/**
 * ignore invalid Https certificate from OPAM
 * <p>see http://javaskeleton.blogspot.com.br/2011/01/avoiding-sunsecurityvalidatorvalidatore.html
 */
public class InvalidCertificateTrustManager implements X509TrustManager{
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    @Override
    public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException {

    }

    @Override
    public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException {
    }
}

maybe it's something you can start with.

of course, since you have the connection, you can retrieve the response contents using

InputStream content = (InputStream) connection.getInputStream();
Share:
53,151
Luixv
Author by

Luixv

More than 20 years of experience in programming and management.

Updated on July 18, 2022

Comments

  • Luixv
    Luixv almost 2 years

    I wrote a Java client which executes http GET requests without any problem. Now I want to modify this client in order to execute https GET requests.

    import org.apache.http.HttpHost;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.CredentialsProvider;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.BasicCredentialsProvider;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    
    private String executeGet(final String url, String proxy, int port)
            throws IOException, RequestUnsuccesfulException, InvalidParameterException {
    
        CloseableHttpClient httpclient = null;
        String ret = "";
        RequestConfig config;
    
        try {                       
            String hostname = extractHostname(url);
            logger.info("Hostname {}", hostname);
    
            HttpHost target = new HttpHost(hostname, 80, null);
    
            HttpHost myProxy = new HttpHost(proxy, port, "http");
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    AuthScope.ANY,
                    new UsernamePasswordCredentials(USERNAME, PASSWORD));
    
            httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();         
            config = RequestConfig.custom().setProxy(myProxy).build();
    
    
            HttpGet request = new HttpGet(url);
            request.setConfig(config);
            CloseableHttpResponse response = httpclient.execute(target, request);
    
            ...
    

    I was expecting an easy modification like using HttpsGet instead of HttpGet but no, there is no HttpsGet class available.

    What is the easiest way to modify this method in order to handle https GET requests?

  • Jalaj Chawla
    Jalaj Chawla over 6 years
    Can you please clarify getContent method is of which class as I was getting error.
  • Luixv
    Luixv over 6 years
    URL.getContent() is a shortcut for openConnection().getContent() so we need to look at the documentation for URLConnection.getContent()
  • Mihkel L.
    Mihkel L. almost 6 years
    it's smart to paste fully working snippet, not some code without imports.