Este articulo se lo dedico a Jakofff Parker Twitter @jakofff , quien en mi momento de mayor frustración al no poder consumir el WebServices en Java tuvo la paciencia y la amabilidad de escribirme un código de ejemplo. El cual prácticamente era mi mismo código, pero con ciertos detalles que si no fueran por el y en mi frustración simplemente no los habría visto. El código de Jakofff lo publicare al final del artículo.
El WebService a consumir escrito en PHP ya lo había publicado en el articulo de “WebService en PHP consumidos en C#” por lo que me ire directo al codigo de Java que lo consume en una aplicación Android.
package net.lastdragon.webservices;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}public String webservices (String Nombre) {
final String SOAP_ACTION =
“urn:webserv”;
final String METHOD = “saludo”;
final String NAMESPACE =
“urn:webserv”;
final String ENDPOINTWS =
“https://www.lastdragon.net/misarchivos/webserv/serv.php”;
String res = null;
try {
SoapObject
userRequest=new SoapObject(NAMESPACE, METHOD);
userRequest.addProperty(“nombre”, Nombre);
SoapSerializationEnvelope envelope = new
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(userRequest);
HttpTransportSE androidHttpTransport = new HttpTransportSE
(ENDPOINTWS);
androidHttpTransport.debug = true;
androidHttpTransport.call(SOAP_ACTION, envelope);
//la
respuesta es una cadena
res
= envelope.getResponse().toString();//si
la respuesta es un tipo de dato, o estructura compleja usa esto
//SoapObject resp = (SoapObject)envelope.getResponse();
//String id = resp.getProperty(“id”).toString();
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
public void clickboton (View v) {
TextView textosalida = (TextView)
findViewById(R.id.salida);
EditText textoentrada =
(EditText) findViewById(R.id.entrada);
textosalida.setText(webservices(textoentrada.getText().toString() ) );
}
En el Manifiesto de Android debe agregarse el permiso para Internet.
<uses-permission android:name=”android.permission.INTERNET”
/>
La librería a importar como Jar Externo es ksoap2-android-assembly-3.0.0-jar-with-dependencies, el código es muy sencillo.
Básicamente todo ocurre cuando se activa el evento del botón onClick que ejecuta el codigo de clickboton, ahí en clickboton ocurre la magia.
Donde es llamado el WebService alimentado por el EditText y la salida resultante es mostrada en el TextView
El código de Jakofff es casi igual, excepto en la clase AndroidHttpTransport la cual es válida en la librería que usa el que es KSoup 2.6.0 pero que esta descontinuado en la librería que uso yo versión 3.0.0 donde la clase se sustituye por HttpTransportSE .
package com.pruebas;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;public class Util {
// nuevos para WS
public static final String SOAP_ACTION =
“urn:webserv”;
public static final String METHOD = “saludo”;
public static final String NAMESPACE = “urn:webserv”;
public static final String ENDPOINTWS =
“https://www.lastdragon.net/misarchivos/webserv/serv.php”;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String r = response(“Jakoff”);
System.out.println(r);
}
public static String response(String name){
String res = null;
try {
SoapObject
userRequest=new SoapObject(NAMESPACE, METHOD);
userRequest.addProperty(“nombre”, name);
SoapSerializationEnvelope envelope = new
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(userRequest);
AndroidHttpTransport androidHttpTransport = new
AndroidHttpTransport(ENDPOINTWS);
androidHttpTransport.debug = true;
androidHttpTransport.call(SOAP_ACTION, envelope);
//la
respuesta es una cadena
res
= envelope.getResponse().toString();//si
la respuesta es un tipo de dato, o estructura compleja usa esto
//SoapObject resp = (SoapObject)envelope.getResponse();
//String id = resp.getProperty(“id”).toString();
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
}
Lo importante del código de Jakofff es que muestra que aunque Ksoup esta pensado para ser usado en Android, también puede implementarse en un programa de consola de Java, ya sea texto o GUI con AWT o Swing
excelente articulo last! saludos.
Esto solo es valido para la API 10 hacia abajo de Android, ya que si se intenta hacer este mismo código en una API posterior a la 10, regresará un error y esto es porque Android 3.0 y posteriores pide que las conexiones se hagan en otro hilo.
Gracias por el tutorial
Por cierto David,
Aquí dejo el código usando otro thread, no se si sea la mejor forma pero funciona usando la API 11 y posteriores… https://gist.github.com/rodmoreno/5671531
Hola Gente es seguido el ejemplo pero no me funciona se me cae la aplicacion haber si alguien me puede ayudar!!!!
se los agradeceria montones
link del code; https://www.dropbox.com/s/xd3l8y662z6m34h/web_service_android.txt
Hola soy nuevo en android actualmente estoy tratando de consumir un web service de PHP y utilizo la libreria KSOAP2 pero me no ha funcionado trato de conectarme pero no da , pero al contrario me conecto a un web service de ASP.NET y si funciona. crei que estaba mal mi web service de PHP pero lo probé con un cliente de php y funciona perfectamente. entonces si podrias ayudarme un poco te agradecería mucho.
Hola esteban, supongo que estas usando una API reciente, este codigo era valido en un android 2.1, ahora por regla todo metodo bloqueador que vaya escrito dentro de una activity debe ser llamado por un hilo para no bloquear la aplicacion mientras el webservice responde.