Android: java.net.protocolException no admite salida
Yo estaba utilizando anteriormente HttpClient y BasicNameValuePairs , por alguna razón tengo que cambiar a HttpUrlConnection .
De ahí este código, para hacer una petición HttpPost con ciertos parámetros:
- Transmisión de datos JSON en solicitud de obtención como cuerpo de solicitud
- HttpURLConnection.getInputStream siempre lanza IOException en android 2.1
- Enviar una imagen codificada en base64 al servidor mediante HttpUrlConnection Android
- Android: Carga de una foto en Cloudinary con devolución de llamada de progreso en HttpURLConnection
- Reutilizando HttpURLConnection
public class MConnections { static String BaseURL = "http://www.xxxxxxxxx.com"; static String charset = "UTF-8"; private static String result; private static StringBuilder sb; private static List<String> cookies = new ArrayList<String>(); public static String PostData(String url, String sa[][]) { HttpURLConnection connection = null; try { connection = (HttpURLConnection) new URL(BaseURL + url) .openConnection(); } catch (MalformedURLException e1) { } catch (IOException e1) { } cookies = connection.getHeaderFields().get("Set-Cookie"); try{ connection.setDoOutput(true); // Triggers POST. connection.setRequestProperty("Accept-Charset", charset); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); }catch (Exception e) { //Here i get Exception that "java.lang.IllegalStateException: Already connected" } OutputStream output = null; String query = ""; int n = sa.length; for (int i = 0; i < n; i++) { try { query = query + sa[i][0] + "=" + URLEncoder.encode(sa[i][1], "UTF-8"); } catch (UnsupportedEncodingException e) { } } try { output = connection.getOutputStream(); output.write(query.getBytes(charset)); } catch (Exception e) { //Here i get Exception that "android: java.net.protocolException: Does not support output" } finally { if (output != null) try { output.close(); } catch (IOException e) { } } InputStream response = null; try { response = connection.getInputStream(); } catch (IOException e) { //Here i get Exception that "java.io.IOException: BufferedInputStream is closed" } finally { //But i am closing it here connection.disconnect(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( response, "iso-8859-1"), 8); sb = new StringBuilder(); sb.append(reader.readLine()); String line = "0"; while ((line = reader.readLine()) != null) { sb.append("\n" + line); } response.close(); result = sb.toString(); } catch (Exception e) { } return result; } }
Pero obtengo tales excepciones como las comentadas en el código.
En realidad estoy llamando a MConnections.PostData () dos veces de mi actividad usando un AsyncTask. Esto podría causar la excepción: Ya conectado, pero estoy utilizando connection.disconnect . Pero ¿por qué sigo recibiendo esa Excepción?
¿Lo estoy usando de manera incorrecta?
Gracias
- DELETE La solicitud no funciona, devuelve el código de estado 200
- Cómo desconectar una HttpUrlConnection en teléfonos HTC (Froyo y abajo)?
- IOException: "El desafío de autenticación recibido es nulo" (Apache Harmony / Android)
- Cómo deshabilitar la búsqueda de WWW-Authenticate encabezado en 401 en HttpUrlConnection en Android?
- La sincronización bidireccional para las cookies entre HttpURLConnection (java.net.CookieManager) y WebView (android.webkit.CookieManager)
- ¿Por qué hay flujos en la API HttpURLConnection?
- Problema de corrupción de bases de datos precargado en la aplicación de Android
- HttpURLConnection Post: El flujo de salida no tiene efecto?
Para la excepción de protocolo, intente agregar lo siguiente antes de llamar a getOutputStream ():
connection.setDoOutput(true);
Descubrió esta respuesta gracias a la respuesta de Brian Roach aquí: https://stackoverflow.com/a/14026377/387781
Nota lateral: Estaba teniendo este problema en mi HTC Thunderbolt corriendo Gingerbread, pero no en mi Nexus 4 corriendo Jelly Bean.
- Obtener "Fragmento no creó una vista" después de la adición de otro Fragmento sin UI
- Creación personalizada de Android mediante Ant