我想代理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);
这似乎不正确 - 我错过了什么?
答案 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代理。
每个企业都有两个开发环境,
当生产环境安装SSL证书时,android模拟器和Volley库会自动检测网络连接,并且您能够按预期使用apis / web服务。
没有解决此问题的其他方法。