【问题标题】:Android HttpClient Doesn't Use System Proxy SettingsAndroid HttpClient 不使用系统代理设置
【发布时间】:2011-05-29 01:18:57
【问题描述】:

当我创建 DefaultHttpClient 对象并尝试访问网页时,请求不会通过我在“设置”中指定的代理进行路由。

查看 API 文档,我看不到任何可以指定代理的地方,尽管 Android 确实有一个 Proxy 类允许我读取系统的代理设置。

有没有办法可以在 HttpClient 中使用代理设置?

【问题讨论】:

标签: android proxy httpclient


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试:

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

    【讨论】:

    • 代理设置出错或代理服务器宕机时会发生什么情况,如何处理
    【解决方案3】:

    首先,我会确保请求符合您在 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);
    

    这些都是“获取”代理设置的方法,“set”方法的实现方式相同,通过 System.setProperty 或 httpclient.setParams。

    希望这有帮助!

    【讨论】:

    • 代理设置出错或代理服务器宕机时会发生什么情况,如何处理
    【解决方案4】:

    试试:

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

    (选自here

    【讨论】:

    • perfekt,但我必须处理设备上的 Web 请求,这些设备可能使用(不同的)代理或没有代理设置,是否有可能确定用户是否有代理设置?我的一些客户正在使用不同的封闭用户组。
    • 要从系统中获取正确的代理,请查看以下答案:stackoverflow.com/questions/10811698/…
    • 设置参数后连接代理会花费太多时间。在我的应用程序中,我有很多 https 请求,每个实例都需要很长时间才能与代理连接。有没有更好的解决方案?
    • 我的上帝...这太棒了
    • @CommonsWare 可以解释一下如果代理服务器关闭会发生什么,我的意思是我们是否会得到任何定义代理已成功设置的响应代码,或者如果不是这种情况,那么我们可以知道是否代理服务器已启动并正在运行...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多