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í:

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.

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.

  • Problemas al configurar un TCP Proxy transparente en Android / Linux
  • Configuraciones del proxy del SDK de Android SDK en LINUX
  • ¿Hay alguna manera de crear un proxy HTTP en VPN en Android?
  • Establecer SDK de Android detrás del servidor proxy?
  • Fuerza HttpURLConnection para utilizar la red móvil y de retorno a WiFi
  • com.android.volley.NoConnectionError - Emulador de Android con Charles Proxy
  • Android WebView - con proxy autenticado
  • Cómo capturar tráfico de aplicaciones en Android
  • Lista de solicitudes HTTP desde el teléfono Android
  • El host remoto cerró la conexión durante el apretón de manos: Certificado Burp en Android
  • Recursos de documentación confusos de proxy de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.