Android Emulator使用HttpGet通过代理访问RESTful web服务



我正试图通过我电脑上的Android Emulator访问RESTful web服务,该服务使用代理连接到互联网。

我有代码可以很好地访问实际Android设备上的网络服务,该设备有自己的数据连接,代码如下:

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

我尝试了许多方法,试图让Emulator允许通过代理进行连接,但都没有成功。

注意,我确实在AndroidManifest.xml中启用了INTERNET:

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

尝试1-设置属性:

这会在execute()调用时为我的服务的URL生成UnknownHostException

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

尝试2-在DefaultHttpClient:中设置代理

这会为实际的代理产生未知主机异常

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中设置代理

这会为我的HttpGet中的URL生成UnknownHostException

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

我不知道还能尝试什么。我愿意接受任何建议。

遇到同样的问题,我在尝试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);

您使用了http proxy http://:模拟器命令行选项还是"设置"->"无线和网络"->"移动网络"->《接入点名称》->"Telkila"或主页>菜单>设置>无线控制>移动网络>接入点名称?

最新更新