2015-12-15 4 views
0

Я пытаюсь реализовать Java-клиент для API WooCommerce. Я могу сделать следующий завиток запрос:Https и базовая аутентификация с Apache HttpClient

curl https://myserver/wc-api/v3/products -k -u ck_mykey:cs_mysecret 

и получить соответствующий ответ. -k означает небезопасное соединение.

Я использую Apache HttpClient 4.x для http-соединений. Googling дал мне несколько примеров с HttpClient 3.x. В HttpClient 4.x больше всего реализовано в версии 3.x. Таким образом, может ли кто-нибудь использовать некоторую реализацию Java + HttpClient для https клиент с Базовая аутентификация.

EDIT:

Хорошо, позвольте мне перефразировать мою проблему. Я получил свободно работать такой код, который делает Basic Auth для запроса GET с помощью BasicAuthCache:

public static void getWithBasicAuth(String host, String url, String username, String password) 
     throws ClientProtocolException, IOException { 

    HttpHost target = new HttpHost(host, 80, "http"); 
    CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
    credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort()), 
      new UsernamePasswordCredentials(username, password)); 
    CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build(); 
    try { 
     AuthCache authCache = new BasicAuthCache(); 
     BasicScheme basicAuth = new BasicScheme(); 
     authCache.put(target, basicAuth); 
     HttpClientContext localContext = HttpClientContext.create(); 
     localContext.setAuthCache(authCache); 

     HttpGet httpget = new HttpGet(url); 

     System.out.println("Executing request " + httpget.getRequestLine() + " to target " + target); 
     for (int i = 0; i < 3; i++) { 
      CloseableHttpResponse response = httpclient.execute(target, httpget, localContext); 
      try { 
       System.out.println("----------------------------------------"); 
       System.out.println(response.getStatusLine()); 
       System.out.println(EntityUtils.toString(response.getEntity())); 
      } finally { 
       response.close(); 
      } 
     } 
    } finally { 
     httpclient.close(); 
    } 
} 

Но как я должен обернуть такой метод в SSL?

+0

Пожалуйста, обратите внимание выполнять некоторые изменения для поиска. Здесь вы найдете: https://hc.apache.org/httpcomponents-client-ga/quickstart.html – Mark

ответ

1

Я нашел ответ, что работает хотя бы для меня. Здесь сделаны только изменения, чтобы добавить поддержку SSL для первоначального запроса GET с проверкой подлинности:

public static void getWithBasicAuthSSL(String host, String url, String username, String password) 
     throws ClientProtocolException, IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { 

    SSLContextBuilder builder = new SSLContextBuilder(); 
    builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); 
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
      builder.build()); 



    HttpHost target = new HttpHost(host, 443, "https"); 
    CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
    credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort()), 
      new UsernamePasswordCredentials(username, password)); 

    CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).setSSLSocketFactory(sslsf).build(); 

    try { 
     AuthCache authCache = new BasicAuthCache(); 
     BasicScheme basicAuth = new BasicScheme(); 
     authCache.put(target, basicAuth); 
     HttpClientContext localContext = HttpClientContext.create(); 
     localContext.setAuthCache(authCache); 

     HttpGet httpget = new HttpGet(url); 

     System.out.println("Executing request " + httpget.getRequestLine() + " to target " + target); 
     for (int i = 0; i < 3; i++) { 
      CloseableHttpResponse response = httpclient.execute(target, httpget, localContext); 
      try { 
       System.out.println("----------------------------------------"); 
       System.out.println(response.getStatusLine()); 
       System.out.println(EntityUtils.toString(response.getEntity())); 
      } finally { 
       response.close(); 
      } 
     } 
    } finally { 
     httpclient.close(); 
    } 
} 
Смежные вопросы