2012-03-08 52 views
1

我試圖通過我的PC上的Android模擬器訪問RESTful Web服務,該模擬器使用代理連接到互聯網。使用HttpGet通過代理訪問RESTful Web服務的Android模擬器

我的代碼工作正常訪問具有與下面的代碼它自己的數據連接的實際Android設備上的Web服務:

DefaultHttpClient client = new DefaultHttpClient(); 
    client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 

    HttpGet request = new HttpGet("http://mytesturl.com/services/serviceName"); 
    UsernamePasswordCredentials creds = 
     new UsernamePasswordCredentials("username", "password"); 
    request.addHeader(BasicScheme.authenticate(creds, "UTF-8", false)); 

    HttpResponse response = client.execute(request); 

我已經嘗試了多種方法來嘗試獲得模擬器允許通過代理進行連接,但沒有任何工作。

注意,我有在AndroidManifest.xml中啓用了INTERNET:

<uses-permission android:name="android.permission.INTERNET" /> 

嘗試1 - 設置屬性:

這在execute()調用產生一個UnknownHostException爲我服務的URL

Properties props = System.getProperties(); 
props.put("http.proxyHost", "httpproxy.mycompany.com"); 
props.put("http.proxyPort", "80"); 

嘗試2 - 設置在DefaultHttpClient代理:

這將產生一個UnknownHostException的實際代理

DefaultHttpClient client = new DefaultHttpClient(); 
client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 

HttpHost proxy = new HttpHost("httpproxy.mycompany.com", 80); 
client.getCredentialsProvider().setCredentials(
     new AuthScope("httpproxy.mycompany.com", 80), 
     new UsernamePasswordCredentials("username", "password")); 
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

HttpGet request = new HttpGet("http://mytesturl.com/services/serviceName"); 
UsernamePasswordCredentials cred = 
    new UsernamePasswordCredentials("username", "password"); 
request.addHeader(BasicScheme.authenticate(cred, "UTF-8", false)); 
HttpResponse response = client.execute(request); 

嘗試3 - 設置在HTTPGET

代理這將產生一個UnknownHostException的URL在我HTTPGET

DefaultHttpClient client = new DefaultHttpClient(); 
client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 

HttpGet request = new HttpGet("http://mytesturl.com/services/serviceName"); 
UsernamePasswordCredentials cred = 
    new UsernamePasswordCredentials("username", "password"); 
request.addHeader(BasicScheme.authenticate(cred, "UTF-8", false)); 
Header bs = new BasicScheme().authenticate(
     new UsernamePasswordCredentials("username", "password"), 
     request); 
request.addHeader("Proxy-Authorization", bs.getValue()); 
HttpResponse response = client.execute(request); 

我不知道還有什麼要嘗試。我願意接受任何建議。

回答

0

您是否使用了-http-proxy http://:emulator命令行選項或「設置」 - >「無線&網絡」 - >「移動網絡」 - >「接入點名稱」 - >「Telkila」或主頁>菜單>設置>無線控制>移動網絡>接入點名稱?

+0

感謝您的建議。我確實嘗試過這些,但模擬器仍然無法連接。 – 2012-03-09 16:45:58

1

有同樣的問題,我成功嘗試3(代碼如下)的變化,其中的差異是setProperty語句。請注意,我所調用的Web服務不需要身份驗證,因此我只設置了代理授權標頭。

System.setProperty("java.net.useSystemProxies", "false"); 
System.setProperty("http.proxyHost", "123.56.7.9"); 
System.setProperty("http.proxyPort", "8080"); 

DefaultHttpClient client = new DefaultHttpClient(); 
client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 

HttpGet request = new HttpGet("web service url"); 
Header bs = new BasicScheme().authenticate(
    new UsernamePasswordCredentials("NETWORKID", "netpassword"), 
    request); 
request.addHeader("Proxy-Authorization", bs.getValue()); 
HttpResponse response = client.execute(request);