【问题标题】:Android Emulator using HttpGet to acess RESTful web service through a proxyAndroid Emulator 使用 HttpGet 通过代理访问 RESTful Web 服务
【发布时间】:2012-03-08 19:47:24
【问题描述】:

我正在尝试通过我电脑上的 Android 模拟器访问 RESTful Web 服务,该模拟器使用代理连接到互联网。

我的代码工作正常,可以在具有自己的数据连接的实际 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() 调用中为我的服务的 URL 生成一个 UnknownHostException

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

这会为我的 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);

我不确定还可以尝试什么。我愿意接受任何建议。

【问题讨论】:

    标签: java android web-services proxy


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的建议。我确实尝试了这些东西,但模拟器仍然无法连接。
      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2014-02-24
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多