android - petición - metodo post con angular
Las solicitudes HTTP Post que usan HttpClient tardan 2 segundos, ¿por qué? (2)
De acuerdo, lo resolví yo mismo con más investigación. Todo lo que tuve que hacer fue agregar un parámetro que establece la versión HTTP a 1.1, de la siguiente manera:
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
Encontré esto gracias a la muy buena Clase HttpHelper de and-bookworm y algo de prueba y error.
Si mal no recuerdo, HTTP 1.0 abre una nueva conexión TCP para cada solicitud. ¿Eso explica la gran demora?
Una solicitud HTTP POST ahora toma entre 50 y 150 ms en WLAN y algo entre 300 y 500 ms en 3G.
Actualización: encontré la respuesta yo mismo, ver a continuación :-)
Hola,
Actualmente estoy codificando una aplicación de Android que envía cosas en segundo plano usando HTTP Post y AsyncTask. Yo uso el paquete org.apache.http.client para esto. Basé mi código en este ejemplo .
Básicamente, mi código se ve así:
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
El problema es que la línea httpclient.execute (..) tarda alrededor de 1,5 a 3 segundos , y no entiendo por qué. Simplemente solicitando una página con HTTP Get toma alrededor de 80 ms o menos, por lo que el problema no parece ser la latencia de la red en sí.
El problema tampoco parece ser del lado del servidor, también he intentado enviar datos a http://www.disney.com/ con resultados lentos similares. Y Firebug muestra 1 ms de tiempo de respuesta al enviar datos a mi servidor localmente.
Esto sucede en el Emulador y con mi Nexus One (ambos con Android 2.2).
Si quieres ver el código completo, lo he puesto en GitHub .
Es solo un programa ficticio para hacer publicaciones HTTP en segundo plano usando AsyncTask con solo presionar un botón. Es mi primera aplicación de Android y mi primer código de Java durante mucho tiempo. Y por separado, también mi primera pregunta sobre Stackoverflow ;-)
¿Alguna idea de por qué httpclient.execute (httppost) lleva tanto tiempo?
No estoy en Android, pero me enfrenté exactamente al mismo tipo de problema en la plataforma de Windows con httpclient 4.0.1, después de un poco de rasguño en la cabeza, encontré la solución.
HttpParams params = new BasicHttpParams();
//this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse;
HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
StringEntity entity = new StringEntity(content, "utf-8");
entity.setContentType("text/plain; charset=utf-8");
httpPost.setEntity(entity);
httpResponse=httpClient.execute(httpPost);
String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
httpResponse.getEntity().consumeContent();
httpClient.getConnectionManager().shutdown();
return(response);
No tengo idea de por qué configurar los parámetros con la versión HTTP1.1 resuelve el problema. pero lo hace también más extraño aún, el síntoma no se muestra si se ejecuta una solicitud HTTP Get.
de todos modos, espero que esto ayude a algunos por ahí!
h