2014-10-15 5 views
1

Я написал java-клиент, который без проблем запускает HTTP-запросы GET. Теперь я хочу изменить этот клиент, чтобыКак выполнить запрос https GET из java

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

     ... 

Теперь я должен послать https GET запросы вместо https. Я ожидал простой модификации, например, HttpsGet вместо HttpGet, но нет, нет HttpsGet класс.

Что является самым простым способом изменить этот метод для обработки запросов https.

ответ

1

я разработал решение, которое выглядит проще, что было выложено здесь

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; 
} 
+0

Можете ли вы уточнить Метод getContent относится к классу, когда я получал ошибку. –

+0

URL.getContent() - это ярлык для openConnection(). GetContent(), поэтому нам нужно посмотреть документацию для URLConnection.getContent() – Luixv

0

это мой быстрый и грязный клиент HTTPS в Java, которая игнорирует недействительные сертификаты и проверку подлинности с помощью 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 { 
    } 
} 

может быть, это с чего вы можете начать.

конечно, так как у вас есть подключение, вы можете получить содержимое ответа с помощью

InputStream content = (InputStream) connection.getInputStream();