Android, Java: Solicitud HTTP POST

Tengo que hacer una solicitud de post http a un servicio web para autenticar al usuario con nombre de usuario y contraseña. El tipo de servicio Web me dio la siguiente información para construir la solicitud HTTP Post.

POST /login/dologin HTTP/1.1 Host: webservice.companyname.com Content-Type: application/x-www-form-urlencoded Content-Length: 48 id=username&num=password&remember=on&output=xml 

La respuesta XML que obtendré es

 <?xml version="1.0" encoding="ISO-8859-1"?> <login> <message><![CDATA[]]></message> <status><![CDATA[true]]></status> <Rlo><![CDATA[Username]]></Rlo> <Rsc><![CDATA[9L99PK1KGKSkfMbcsxvkF0S0UoldJ0SU]]></Rsc> <Rm><![CDATA[b59031b85bb127661105765722cd3531==AO1YjN5QDM5ITM]]></Rm> <Rl><![CDATA[username@company.com]]></Rl> <uid><![CDATA[3539145]]></uid> <Rmu><![CDATA[f8e8917f7964d4cc7c4c4226f060e3ea]]></Rmu> </login> 

Esto es lo que estoy haciendo HttpPost postRequest = new HttpPost (urlString); ¿Cómo construyo el resto de los parámetros?

Aquí está un ejemplo encontrado previamente en androidsnippets.com (el sitio actualmente no se mantiene más).

 // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); try { // Add your data 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) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } 

Por lo tanto, puede agregar sus parámetros como BasicNameValuePair .

Una alternativa es utilizar (Http)URLConnection . Consulte también Uso de java.net.URLConnection para disparar y gestionar solicitudes HTTP . Este es el método preferido en versiones más recientes de Android (Gingerbread +). Vea también este blog , este doc de desarrollador y el javadoc de HttpURLConnection de Android.

A @BalusC respuesta Me gustaría añadir cómo convertir la respuesta en una cadena:

 HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); String result = RestClient.convertStreamToString(instream); Log.i("Read from server", result); } 

Aquí hay un ejemplo de convertStramToString .

Por favor considere usar HttpPost. Adoptar de este: http://www.javaworld.com/javatips/jw-javatip34.html

 URLConnection connection = new URL("http://webservice.companyname.com/login/dologin").openConnection(); // Http Method becomes POST connection.setDoOutput(true); // Encode according to application/x-www-form-urlencoded specification String content = "id=" + URLEncoder.encode ("username") + "&num=" + URLEncoder.encode ("password") + "&remember=" + URLEncoder.encode ("on") + "&output=" + URLEncoder.encode ("xml"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Try this should be the length of you content. // it is not neccessary equal to 48. // content.getBytes().length is not neccessarily equal to content.length() if the String contains non ASCII characters. connection.setRequestProperty("Content-Length", content.getBytes().length); // Write body OutputStream output = connection.getOutputStream(); output.write(content.getBytes()); output.close(); 

Usted necesitará coger la excepción usted mismo.

Pruebe HttpClient para Java:

http://hc.apache.org/httpclient-3.x/

Puede volver a utilizar la implementación que agregué a ACRA: http://code.google.com/p/acra/source/browse/tags/REL-3_1_0/CrashReport/src/org/acra/HttpUtils.java?r=236

(Vea el método doPost (Mapa, Url), trabajando sobre http y https incluso con certificados auto firmados)

Utilicé el siguiente código para enviar HTTP POST desde mi aplicación de cliente de Android a la aplicación de escritorio de C # en mi servidor:

 // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); try { // Add your data 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) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } 

He trabajado en la lectura de la solicitud de una aplicación C # en mi servidor (algo así como un servidor web poco aplicación). Me las arreglé para leer la solicitud de datos publicados con el siguiente código:

 server = new HttpListener(); server.Prefixes.Add("http://*:50000/"); server.Start(); HttpListenerContext context = server.GetContext(); HttpListenerContext context = obj as HttpListenerContext; HttpListenerRequest request = context.Request; StreamReader sr = new StreamReader(request.InputStream); string str = sr.ReadToEnd(); 

Prefiero recomendarle que use Volley para hacer GET, PUT, POST … peticiones.

Primero, agregue dependencia en su archivo gradle.

compile 'com.he5ed.lib:volley:android-cts-5.1_r4'

Ahora, utilice este fragmento de código para realizar solicitudes.

 RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); StringRequest postRequest = new StringRequest( com.android.volley.Request.Method.POST, mURL, new Response.Listener<String>() { @Override public void onResponse(String response) { // response Log.d("Response", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // error Log.d("Error.Response", error.toString()); } } ) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); //add your parameters here as key-value pairs params.put("username", username); params.put("password", password); return params; } }; queue.add(postRequest); 
  • No se encontraron propiedades key.store y key.alias en build.properties
  • GZIP en Android
  • ¿Cuál es la manera de insertar un enorme JSON datos en un DB de SQLite en android
  • Actualizar vista en tiempo de ejecución en Android
  • No se pueden cargar archivos de biblioteca .so al hacer una aplicación de sistema
  • Clase de BlackBerry equivalente a AsyncTask?
  • Cómo determinar mediante programación si android está conectado a wifi?
  • Com.android.camera.action.CROP establece fondo de pantalla en Motorola Defy
  • ¿Cuál es el equivalente de JFrame para Android?
  • Programación de Android m antes de los objetos
  • publicar imagen Tipo mime no válido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.