com.android.volley.NoConnectionError - 使用Charles Proxy的Android模拟器

时间:2016-08-12 16:10:41

标签: android proxy android-volley charles-proxy

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

我似乎无法让它发挥作用。

我的模拟器使用以下方式启动:

emulator @Nexus_5X_API_23 -http-proxy 10.0.1.17:8888

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

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

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

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

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

为什么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);

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

2 个答案:

答案 0 :(得分:2)

为了帮助解决

  

java.io.IOException:Connection

上意外的流结束

问题请回答评论中的问题。

关于

  

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

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

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

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

然后为你调试构建你可以使用smth:

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

答案 1 :(得分:-1)

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

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

  1. 开发(http):不需要任何SSL证书
  2. 生产(https):需要SSL证书
  3. 当生产环境安装SSL证书时,android模拟器和Volley库会自动检测网络连接,并且您能够按预期使用apis / web服务。

    没有解决此问题的其他方法。