2012-05-04 3 views
0

Я ищу, чтобы выполнить GET в службе курсов валют yahoo через Apache HttpClient 4.1.2, но я получаю исключение UknownHost при доступе через брандмауэр компании. Код отлично работает, когда я пытаюсь его из дома (без какой-либо конфигурации прокси, конечно).Прокси-имя пользователя/пароль в Apache HttpClient

Также URL-адрес открывается в моем браузере, но не может быть отправлен из командной строки.

Образец URL является http://quote.yahoo.com/d/quotes.csv?f=l1&s=USDINR=X

EDIT 2: Вот полный код, который я использовал для подключения к финансовой службы Yahoo:

GetRate.java

public class GetRate { 
    public static void main(String[] args) { 
     final String FROM = "USD"; 
     final String TO = "INR"; 

     ArrayList<String> paramsList = new ArrayList<String>(); 
      paramsList.add(FROM + TO); 
      System.out.println("Tracking "+ TO + " vs. " + FROM + " Exchange Rate..."); 

     try { 
       double _new = new Double(RestClient.doGet(paramsList)); 
      double _old = _new; 

      while(true) { 
       _new = new Double(RestClient.doGet(paramsList)); 
        if(_old != _new) 
         _old = _new; 
       Thread.sleep(1000); 
      } 
     } catch (HttpException e) { 
        e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (URISyntaxException e) { 
     e.printStackTrace(); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
     } 
} 

RestClient.java

public class RestClient { 
public static final int HTTP_OK = 200; 
public static final String SERVER_URL = "http://quote.yahoo.com/d/quotes.csv"; 
public static final String DEFAULT_ENCODING = "UTF-8"; 

public static String doGet(final ArrayList<String> params) throws HttpException, 
     IOException, URISyntaxException { 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpConnectionParams 
      .setConnectionTimeout(httpClient.getParams(), 10000); 

    httpClient = proxyConfig(httpClient); 

    HttpHost targetHost = new HttpHost(SERVER_URL); 
    String urlParams = "?f=l1"; 
    if(!params.isEmpty()) { 
     for(String param : params) { 
      String paramString = "s=" + URLEncoder.encode(param, DEFAULT_ENCODING) + "=X"; 
      urlParams += (urlParams.length() > 1) ? ("&" + paramString) : paramString; 
     } 
    } 
    HttpGet httpget = new HttpGet(urlParams); 

    System.out.println("Final URL: " + httpget.getURI().toString()); 

    HttpResponse response = httpClient.execute(targetHost, httpget); 
    HttpEntity entity = response.getEntity(); 
    InputStream instream = entity.getContent(); 
    return read(instream); 
} 

private static String read(InputStream in) throws IOException { 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000); 
    for (String line = r.readLine(); line != null; line = r.readLine()) { 
     sb.append(line + ","); 
    } 
    in.close(); 
    return sb.toString().substring(0, sb.length() - 1); 
} 

    /** Proxy config Approach 1 */ 
private static DefaultHttpClient proxyConfig(DefaultHttpClient httpClient) {  
    AuthScope auth = new AuthScope("proxy.tcs.com", 8080); 
    Credentials creds = new UsernamePasswordCredentials("USER_NAME", "PASSWORD"); 
    httpClient.getCredentialsProvider().setCredentials(auth, creds); 

    return httpClient; 
} 
}  for(String param : params) { 
      String paramString = "s=" + URLEncoder.encode(param, DEFAULT_ENCODING) + "=X"; 
      urlParams += (urlParams.length() > 1) ? ("&" + paramString) : paramString; 
    } 
} 

HttpGet httpget = new HttpGet(urlParams); 
HttpResponse response = httpClient.execute(targetHost, httpget); 
HttpEntity entity = response.getEntity(); 
InputStream instream = entity.getContent(); 

Подход 2: Я также пробовал следующую конфигурацию прокси, но не смог узнать, как добавить имя пользователя/пароль.

/** Proxy config Approach 2 */ 
HttpHost proxy = new HttpHost("PROXY_HOST", PROXY_PORT); 
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

Спасибо,
Debojit

EDIT 1:
StackTrace для подхода 1:

java.net.UnknownHostException: http://quote.yahoo.com/d/quotes.csv 
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source) 
at java.net.InetAddress.getAddressFromNameService(Unknown Source) 
at java.net.InetAddress.getAllByName0(Unknown Source) 
at java.net.InetAddress.getAllByName(Unknown Source) 
at java.net.InetAddress.getAllByName(Unknown Source) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:242) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:130) 
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) 
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) 
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776) 
at ws.client.RestClient.doGet(RestClient.java:48) 
at ws.client.GetRate.main(GetRate.java:22) 

StackTrace для подхода 2:

Exception in thread "main" java.lang.NumberFormatException: For input string: "<HEAD><TITLE>Proxy Authorization Required</TITLE></HEAD>,<BODY BGCOLOR="white" FGCOLOR="black"><H1>Proxy Authorization Required</H1><HR>,<FONT FACE="Helvetica,Arial"><B>,Description: Authorization is required for access to this proxy</B></FONT>,<HR>,<!-- default "Proxy Authorization Required" response (407) -->,</BODY>," 
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) 
at java.lang.Double.valueOf(Unknown Source) 
at java.lang.Double.<init>(Unknown Source) 
at ws.client.GetRate.main(GetRate.java:22) 

Дело в том, что я не уверен, где код получает HTML в качестве входных данных и почему.

ответ

0

Вы используете «PROXY_HOST» буквально для конструктора прокси? Если это так, вы должны использовать прокси-хост в настройках вашего браузера. То же самое для PROXY_PORT.

Вы не сможете отправлять Yahoo из вашей компании из-за брандмауэра, но вы можете получить доступ через ваш браузер, потому что он настроен на использование прокси-сервера.

+0

Я использую информацию прокси из своего браузера. PROXY_HOST - это просто местозаполнитель (вид). – Debojit

+0

Хорошо, извините за мой вопрос, тогда;). Я не вижу, чтобы вы установили конфигурацию прокси-сервера перед выполнением вызова. Посмотрите пример, как это сделать здесь: http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java – Sircom

+0

Я уже сделал это .. моя реализация основана на информации там. Но я не могу найти там какие-то методы, такие как 'client.getState()'. Я предполагаю, что «клиент» относится к «HttpClient» или «DefaultHttpClient», но такого метода в любом классе не было. – Debojit

Смежные вопросы