【问题标题】:com.android.volley.NoConnectionError - Android emulator with Charles Proxycom.android.volley.NoConnectionError - 带有 Charles Proxy 的 Android 模拟器
【发布时间】:2016-12-19 17:25:32
【问题描述】:

我想为 Android 模拟器代理网络流量。

我似乎无法让它工作。

我的模拟器是用这个启动的:

emulator @Nexus_5X_API_23 -http-proxy 10.0.1.17:8888

IP 和端口指向 Charles 在帮助菜单中报告的内容。

已安装 SSL 证书。我可以打开模拟器浏览器,Charles 会向我显示所有流量。浏览器照常更新。

到目前为止,一切似乎都很好。

现在我尝试运行我的应用程序。我的第一个网络电话通过 Charles 成功发出。响应返回,Charles 显示它。但是响应没有成功传递给应用程序。

我在错误回调中设置了一个断点,我可以看到由java.io.IOException: unexpected end of stream on Connection 引起的com.android.volley.NoConnectionError

为什么 Charles 不将结果正确地传回应用程序?

我需要执行the end of the configuration page on Charles 中定义的操作吗?

HttpHost httpproxy = new HttpHost("192.168.0.101", 8888, "http");
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,httpproxy);

这似乎不正确 - 我错过了什么?

【问题讨论】:

  • 您在谈论 SSL 证书...您的代理 SSL 是一个吗?或者您正在尝试连接到受 SSL 保护的网站?
  • 如果你想监控https流量,我建议你使用Fiddler,这方面更方便。
  • 你用什么HttpStack?在启动模拟器时尝试添加 -verbose-proxy 并将输出添加到问题中

标签: android proxy android-volley charles-proxy


【解决方案1】:

唯一的方法是在服务器端安装 SSL(安全套接层)证书,然后无需设置任何 Charles 代理。

每个企业都有两个开发环境,

  1. 开发(http):不需要任何 SSL 证书
  2. 生产(https):需要 SSL 证书

当生产环境安装 SSL 证书时,android 模拟器和 Volley 库会自动检测网络连接,您可以按预期使用 apis/web 服务。

这个问题没有其他解决方案。

【讨论】:

    【解决方案2】:

    为了帮助解决

    java.io.IOException:连接上的流意外结束

    问题请回答cmets中的问题。

    关于

    HttpHost httpproxy = new HttpHost("192.168.0.101", 8888, "http"); httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,httpproxy);

    它不会像那样帮助你。 事实上,这是应用代理的另一种方式,IMO 甚至比“-http-proxy”更好,因为您可以将它应用到任何地方,不仅适用于模拟器,而且仅适用于此应用程序构建。

    您需要在您使用的 Http Stack 中应用代理。例如:

    public class ProxyHurlStack extends HurlStack {
    
        @Override
        protected HttpURLConnection createConnection(URL url) throws IOException {
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.1.17", 8888));
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
            return conn;
        }
    }
    

    然后为您调试构建,您可以使用类似:

    requestQueue = Volley.newRequestQueue(context, new ProxyHurlStack());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多