Android HttpClient没有使用系统代理设置

13
当我创建一个DefaultHttpClient对象并尝试访问网页时,请求没有通过我在设置中指定的代理路由。
查看API文档,我没有看到任何地方可以指定代理,尽管Android有一个Proxy类,允许我读取系统的代理设置。
我能否在HttpClient中使用代理设置?

有一个 HttpRoute 的构造函数,它接受代理主机作为参数来形成路由...但我不知道如何创建一个将使用它的 HttpClient。http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoute.html - David J. Liszewski
是的,我也看到了,但我不知道如何将它们连接在一起。 - Cristian
1
哦哦..你看到这个答案了吗?http://stackoverflow.com/questions/2539669/android-unable-to-make-httprequest-behind-firewall/2542928#2542928 - David J. Liszewski
4个回答

24

尝试:

DefaultHttpClient httpclient = new DefaultHttpClient();

HttpHost proxy = new HttpHost("someproxy", 8080);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

(选自这里


3
完美,但我必须处理可能使用(不同的)代理或没有代理设置的设备上的Web请求,是否有可能找出用户是否具有代理设置?我的一些客户正在使用不同的封闭用户组。 - 2red13
获取系统中正确的代理,请查看此答案:https://dev59.com/Zmgv5IYBdhLWcg3wKthA#13616054 - Adam
设置参数后连接代理需要太长时间。在我的应用程序中,我有很多https请求,每个实例连接代理都需要很长时间。是否有更好的解决方案? - Crazy Coder
我的天啊...这太棒了。 - Jocheved
1
@CommonsWare,您能否解释一下如果代理服务器宕机会发生什么情况,我的意思是我们是否会收到任何响应代码来定义代理已成功设置,或者如果不是这种情况,那么我们是否可以知道代理服务器是否正在运行... - Pratswinz
我之所以问上述问题,是因为如果代理服务器宕机,我想直接将请求路由到主服务器。 - Pratswinz

9
首先,我会确保请求遵循在Android设备设置中设置的代理设置属性。您可以通过查看android.provider.Settings中的System类来通过代码确定这一点。
要确定用户是否具有系统代理设置,可以执行以下操作:
    System.getProperty("http.proxyHost");
    System.getProperty("http.proxyPort");

    System.getProperty("https.proxyHost");
    System.getProperty("https.proxyPort");

如果您有DefaultHTTPClient的实例,那么您可以检查它是否具有相关的代理设置。
    DefaultHttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().getParameter(ConnRoutePNames.DEFAULT_PROXY);

这些都是获取代理设置的方法,而“设置”方法的实现方式也是相同的,可以通过System.setProperty或httpclient.setParams实现。
希望这能有所帮助!

如果代理设置出错或代理服务器宕机,会发生什么情况?如何处理这些情况? - Pratswinz

3
我正在开发Android代理库,旨在为每个Android版本抽象出对代理设置的访问。您可以轻松获取用户当前选择的代理设置。

1
尝试:
System.setProperty("http.proxyHost", <your proxy host name>);
System.setProperty("http.proxyPort", <your proxy port>);

或者

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpHost httpproxy = new HttpHost("<your proxy host>",<your proxy port>);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,  httpproxy);

或者

HttpHost proxy = new HttpHost("ip address",port number);  
DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);

HttpPost httpost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("param name", param));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.ISO_8859_1));
HttpResponse response = httpclient.execute(httpost);

HttpEntity entity = response.getEntity(); 
System.out.println("Request Handled?: " + response.getStatusLine());
InputStream in = entity.getContent();
httpclient.getConnectionManager().shutdown();

如果代理设置出错或代理服务器宕机,会发生什么情况?如何处理这些情况? - Pratswinz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接