繁体   English   中英

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

[英]Android Emulator using HttpGet to acess RESTful web service through a proxy

我正在尝试通过PC上的Android仿真器访问RESTful Web服务,该服务使用代理连接到Internet。

我的代码工作正常,可以在具有以下数据的自己的数据连接的实际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);

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

在遇到相同问题的情况下,我成功进行了尝试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”或“主页”>“菜单”>设置>无线控件>移动网络>接入点名称?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM