Я разрабатываю приложение для Android и уже обнаружил, что разные версии Android по-разному обрабатывают Http(s)URLConnections (http://stackoverflow.com/q/9556316/151682).
Я столкнулся с проблемой, что Android 4 хорошо выполняет запрос POST через HTTPS, автоматически добавляя заголовки, такие как Content-Type, при запуске кода ниже.
Однако на Android 2.3.5 (устройство и эмулятор) любая запись в выходной поток, по-видимому, игнорируется — я отладил его с помощью веб-прокси Charles, и хотя все заголовки отправляются, данные, записанные в выходной поток, не отправляются ...
Кто-нибудь знает, как это решить?
Примечание. Поскольку API, для которого я разрабатываю, имеет только самозаверяющий сертификат, мне нужно отключить проверку сертификации на данный момент.
Тиа, Патрик
Обновление Тем временем я также безрезультатно пытался выполнить следующие действия:
- Вызов
close()
после вызоваflush()
в BufferedOutputStream - Вызов
close()
как для OutputStream, так и для BufferedOutputStream - Вместо этого используйте OutputStreamWriter
Не звонить
close()
до звонкаgetInputStream()
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(CONNECT_TIMEOUT); connection.setDoOutput(true); // Triggers POST. connection.setRequestMethod("POST"); int contentLength = 0; if(body != null) { contentLength = body.getBytes().length; } // Workarounds for older Android versions who do not do that automatically (2.3.5 for example) connection.setRequestProperty(HTTP.TARGET_HOST, url.getHost()); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Set SSL Context -- Development only if(context != null && connection instanceof HttpsURLConnection){ HttpsURLConnection conn = (HttpsURLConnection)connection; conn.setSSLSocketFactory(context.getSocketFactory()); conn.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } try{ // Add headers if(headers != null){ for (NameValuePair nvp : headers) { if(nvp != null){ connection.setRequestProperty(nvp.getName(), nvp.getValue()); } } } connection.setFixedLengthStreamingMode(contentLength); OutputStream outputStream = null; try { if(body != null){ outputStream = connection.getOutputStream(); BufferedOutputStream stream = new BufferedOutputStream(outputStream); stream.write(body.getBytes()); // <<<< No effect ?! stream.flush(); } } finally { if (outputStream != null) try { outputStream.close(); } catch (IOException logOrIgnore) { // ... } } InputStream inputStream = connection.getInputStream(); // .... Normal case .... } catch(IOException e){ // ... Exception! Check Error stream and the response code ... } finally{ connection.disconnect(); }
}
body != null
иcontentLength > 0
? Вы действительно регистрируете/проверяете любые исключения, которые могут возникать в блоке try? Какой код ответа сервера? - person kaliatech   schedule 20.04.2012