Com.android.volley.NoConnectionError - Android-эмулятор с Charles Proxy

Я хочу прокси-сервер для эмулятора Android.

Я не могу заставить его работать.

Мой эмулятор загружается с помощью этого:

emulator @Nexus_5X_API_23 -http-proxy 10.0.1.17:8888

IP и порт указывают на то, что Чарльз сообщает в меню "Справка".

Установлен сертификат SSL. Я могу открыть браузер эмулятора, и Чарльз показывает мне весь трафик. Браузер обновляется, как обычно.

Все кажется хорошим до сих пор.

Теперь я пытаюсь запустить свое приложение. Мой первый сетевой звонок успешно проходит через Чарльза. Ответ возвращается, и Чарльз отображает его. Однако ответ не передается в приложение успешно.

Я установил точку останова в обратном вызове ошибки, и я могу видеть com.android.volley.NoConnectionError, вызванный java.io.IOException: unexpected end of stream on Connection.

Почему Чарльз не вернул результат обратно в приложение?

Нужно ли мне делать то, что определено на конце страницы конфигурации в Charles?

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

Это не кажется правильным - чего мне не хватает?

Ответы

Ответ 1

Чтобы помочь решить

java.io.IOException: неожиданный конец потока при подключении

вопрос, пожалуйста, ответьте на вопросы в комментариях.

Что касается

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

Ответ 2

Единственный способ установить сертификат SSL (Secure Socket Layer) на конец сервера, тогда нет необходимости устанавливать прокси-сервер Charles.

Каждое предприятие имеет две среды разработки,

  • Разработка (http): не требуется SSL-сертификат.
  • Производство (https): требуется сертификат SSL

Когда производственная среда устанавливает сертификат SSL, тогда эмулятор android и библиотека Volley автоматически обнаруживают сетевое соединение, и вы могли потреблять apis/web-сервисы, как ожидалось.

Нет другого решения этой проблемы.