Android, ¿por qué el método HttpPost devuelve dos resultados diferentes en Android v2.3 y Android v4.0.3?
He creado un código de ejemplo para comparar la salida del método HttpPost en dos sistemas operativos Android diferentes, v2.3 y v4.0. Tengo una tarjeta SIM que estoy utilizando el servicio 3G de un operador. Por lo tanto, me estoy conectando a Internet a través del servicio 3G. La dirección y el puerto del servidor proxy se establecen automáticamente por el operador móvil y son iguales para ambos.
Mi código es así:
- Notificación push con proxy
- ¿La configuración de proxy de Android se aplica a todas las aplicaciones del dispositivo?
- ¿Cómo enrutar todo el tráfico procedente del anclaje?
- ¿Cómo puedo conectarme a un proxy en Android?
- Android Socket problema en Samsung Galaxy S4 (SGS4)
public class MainActivity extends Activity { private final String TAG = "MainActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "inside onCreate()..."); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo(); if (activeNetwork != null) { Log.i(TAG, "Internet connection found."); new MyAsyncTask().execute(); } else Log.i(TAG, "Internet connection not found."); } private class MyAsyncTask extends AsyncTask<Void, Void, Boolean> { @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute()..."); } @Override protected Boolean doInBackground(Void... arg0) { boolean status = false; String xml = postData(); if(xml != null) status = true; return status; } @Override protected void onPostExecute(Boolean result) { if (result) Log.i(TAG, "Process finished successfully..."); } } private String postData() { HttpClient httpClient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4); nameValuePairs.add(new BasicNameValuePair("u", Uri.encode("test01"))); nameValuePairs.add(new BasicNameValuePair("p", Encryption.encrypt("112233"))); nameValuePairs.add(new BasicNameValuePair("v", "1.1")); nameValuePairs.add(new BasicNameValuePair("t", "0")); try { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); Log.i("Requestd Connection", httppost.getURI().toString()); HttpResponse response = httpClient.execute(httppost); String responseBody = EntityUtils.toString(response.getEntity()); Log.i("Server Response: ", responseBody); if (response.containsHeader("Set-Cookie")) { String sessionId = extractSessionId(response.getHeaders("Set-Cookie")[0].getValue()); // PropertyManager.setSessionID(sessionId); Log.i("Session Id:", sessionId); } else Log.e("ERROR", "Response doesn't have Set-Cookie in header"); return responseBody; } catch(UnsupportedEncodingException usee) { usee.printStackTrace(); } catch(ClientProtocolException cpe) { cpe.printStackTrace(); } catch(IOException ioe) { ioe.printStackTrace(); } return null; } private String extractSessionId(String str) { String session = null; if (str!=null) session = str.substring(0, str.indexOf(";")); return session; } }
Cuando ejecuto esta aplicación en Android v2.3 dispositivo (Samsung Galaxy S), mi salida es como esto en logcat:
07-09 18:21:11.031: I/MainActivity(1277): inside onCreate()... 07-09 18:21:11.035: I/MainActivity(1277): Internet connection found. 07-09 18:21:11.035: I/MainActivity(1277): onPreExecute()... 07-09 18:21:11.718: I/Requestd Connection(1277): http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx? 07-09 18:21:13.941: I/Server Response:(1277): <TD ID="LGFLAG">S</TD><TD ID="LGMSG"></TD><TD ID="CLNT_0">CLNTXXX,EF TEST,C,001,</TD> 07-09 18:21:13.941: I/Session Id:(1277): ASPNETSESSIONID=jjodj3m22notn1m50oxs0u55 07-09 18:21:13.941: I/MainActivity(1277): Process finished successfully...
Mientras, cuando ejecuto la aplicación en Android V4.0.3 (Samsung Galaxy 2 o HTC Xperia), la salida es como esto en logcat:
07-09 18:08:45.085: I/MainActivity(19358): inside onCreate()... 07-09 18:08:45.090: I/MainActivity(19358): Internet connection found. 07-09 18:08:45.090: I/MainActivity(19358): onPreExecute()... 07-09 18:08:45.155: I/Requestd Connection(19358): http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx? 07-09 18:08:46.235: I/Server Response:(19358): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 07-09 18:08:46.235: I/Server Response:(19358): "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 07-09 18:08:46.235: I/Server Response:(19358): <html xmlns="http://www.w3.org/1999/xhtml"> 07-09 18:08:46.235: I/Server Response:(19358): <head> 07-09 18:08:46.235: I/Server Response:(19358): <title></title> 07-09 18:08:46.235: I/Server Response:(19358): </head> 07-09 18:08:46.235: I/Server Response:(19358): <body> 07-09 18:08:46.235: I/Server Response:(19358): <table> 07-09 18:08:46.235: I/Server Response:(19358): <tr> 07-09 18:08:46.235: I/Server Response:(19358): <td id="LGFLAG">S</td> 07-09 18:08:46.235: I/Server Response:(19358): <td id="LGMSG"></td> 07-09 18:08:46.235: I/Server Response:(19358): <td id="CLNT_0">CLNTXXX,EF TEST,C,001,</td> 07-09 18:08:46.235: I/Server Response:(19358): </tr> 07-09 18:08:46.235: I/Server Response:(19358): </table> 07-09 18:08:46.235: I/Server Response:(19358): </body> 07-09 18:08:46.235: I/Server Response:(19358): </html> 07-09 18:08:46.235: E/ERROR(19358): Response doesn't have Set-Cookie in header 07-09 18:08:46.440: I/MainActivity(19358): Process finished successfully...
Como puedes ver, mis datos XML están envueltos por código HTML. Este código HTML viene de dónde? Alguien dijo que tal vez es debido a un servidor proxy que se establece automáticamente por el operador móvil. ¿Es correcto? Creo que no debería ser correcto, porque si el servidor proxy manipular mi código o inyectar algo a mi código en v4.0.3 ¿por qué no tengo la misma respuesta con Android v2.0 y v3.0? ¿Es debido a error dentro de Android v4.0? !!!
Cualquier sugerencia sería apreciada.
- Android studio - gradle no pudo resolver las dependencias
- Configuración de SDK de Android con ubuntu
- Notificaciones push de GCM que no proceden de proxy
- Transmisión con Android MediaPlayer en SDK 8
- HttpsUrlConnection con proxy
- Primera ejecución de Android Studio. No se puede acceder a la lista de complementos SDK de Android
- Configurar Http Proxy en Android Studio
- Charles ssl certificado de descarga no "debido a fallos de red"
Parece que falta aceptar contet-tipo para la solicitud.
Trate de añadir algo como:
httppost.setHeader("Accept","application/xml");
Si no es así, configure Apache HttpClient iniciando sesión:
https://stackoverflow.com/a/3303131/538169
y buscar las diferencias en las solicitudes.
- Creación de archivo APK de Android en línea formulario de sitio PHP
- Cómo importar el formato android.os.bundle en proyectos normales de java?