gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:18:28 26 4
gpt4 key购买 nike

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

我的代码可以正常访问实际 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 中启用了互联网:

<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 服务不需要身份验证,因此我只设置代理授权 header 。

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

关于java - Android Emulator 使用 HttpGet 通过代理访问 RESTful Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com