{"id":733,"date":"2013-05-21T00:12:18","date_gmt":"2013-05-21T06:12:18","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=733"},"modified":"2013-05-21T00:12:18","modified_gmt":"2013-05-21T06:12:18","slug":"consumiendo-un-webservice-de-php-con-java-y-android-con-libreria-ksoap2","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=733","title":{"rendered":"Consumiendo un WebService de PHP con Java y Android con librer\u00eda ksoap2"},"content":{"rendered":"<p>Este articulo se lo dedico a <a href=\"https:\/\/twitter.com\/jakofff\">Jakofff Parker \u200f<strong>Twitter @jakofff<\/strong><\/a> , quien en mi momento de mayor frustraci\u00f3n al no poder consumir el WebServices en Java tuvo la paciencia y la amabilidad de escribirme un c\u00f3digo de ejemplo. El cual pr\u00e1cticamente era mi mismo c\u00f3digo, pero con ciertos detalles que si no fueran por el y en mi frustraci\u00f3n simplemente no los habr\u00eda visto. El c\u00f3digo de Jakofff lo publicare al final del art\u00edculo.<\/p>\n<p>El WebService a consumir escrito en PHP ya lo hab\u00eda publicado en el articulo de \u201c<a href=\"https:\/\/www.lastdragon.net\/?p=730\">WebService en PHP consumidos en C#<\/a>\u201d por lo que me ire directo al codigo de Java que lo consume en una aplicaci\u00f3n Android.<\/p>\n<blockquote><p>package net.lastdragon.webservices;<\/p>\n<p>\nimport android.os.Bundle;<br \/>\nimport android.view.View;<br \/>\nimport android.widget.EditText;<br \/>\nimport android.widget.TextView;<\/p>\n<p>import org.ksoap2.SoapEnvelope;<br \/>\nimport org.ksoap2.serialization.SoapObject;<br \/>\nimport org.ksoap2.serialization.SoapSerializationEnvelope;<br \/>\nimport org.ksoap2.transport.HttpTransportSE;<\/p>\n<p>import android.app.Activity;<\/p>\n<p>public class MainActivity extends Activity {<\/p>\n<p>&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; @Override<br \/>\n&nbsp;&nbsp;&nbsp; protected void onCreate(Bundle savedInstanceState) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nsuper.onCreate(savedInstanceState);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nsetContentView(R.layout.activity_main);<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>\n&nbsp;&nbsp;&nbsp; public String webservices (String Nombre) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final String SOAP_ACTION =<br \/>\n&#8220;urn:webserv&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final String METHOD = &#8220;saludo&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final String NAMESPACE =<br \/>\n&#8220;urn:webserv&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final String ENDPOINTWS =&nbsp;<br \/>\n&#8220;https:\/\/www.lastdragon.net\/misarchivos\/webserv\/serv.php&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String res = null;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SoapObject<br \/>\nuserRequest=new SoapObject(NAMESPACE, METHOD);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nuserRequest.addProperty(&#8220;nombre&#8221;, Nombre);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nSoapSerializationEnvelope envelope = new<br \/>\nSoapSerializationEnvelope(SoapEnvelope.VER11);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nenvelope.setOutputSoapObject(userRequest);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nHttpTransportSE&nbsp; androidHttpTransport = new HttpTransportSE<br \/>\n(ENDPOINTWS);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroidHttpTransport.debug = true;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroidHttpTransport.call(SOAP_ACTION, envelope);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/la<br \/>\nrespuesta es una cadena<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res<br \/>\n= envelope.getResponse().toString();<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/si<br \/>\nla respuesta es un tipo de dato, o estructura compleja usa esto<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n\/\/SoapObject resp = (SoapObject)envelope.getResponse();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n\/\/String id = resp.getProperty(&#8220;id&#8221;).toString();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\ne.printStackTrace();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return res;<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; public void clickboton (View v) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TextView textosalida = (TextView)<br \/>\nfindViewById(R.id.salida);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; EditText textoentrada =<br \/>\n(EditText) findViewById(R.id.entrada);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\ntextosalida.setText(webservices(textoentrada.getText().toString() ) );<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p><\/blockquote>\n<p>En el Manifiesto de Android debe agregarse el permiso para Internet.<\/p>\n<p>&nbsp;&lt;uses-permission android:name=&#8221;android.permission.INTERNET&#8221;<br \/>\n\/&gt;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/webserv\/webservandroid.png\" alt=\"Android WebServices\" \/><\/p>\n<p>La librer\u00eda a importar como Jar Externo es ksoap2-android-assembly-3.0.0-jar-with-dependencies, el c\u00f3digo es muy sencillo.<\/p>\n<p>B\u00e1sicamente todo ocurre cuando se activa el evento del bot\u00f3n onClick que ejecuta el codigo de <strong>clickboton<\/strong>, ah\u00ed en clickboton ocurre la magia.<\/p>\n<p>Donde es llamado el WebService alimentado por el EditText y la salida resultante es mostrada en el TextView<\/p>\n<p>El c\u00f3digo de Jakofff es casi igual, excepto en la clase AndroidHttpTransport la cual es v\u00e1lida en la librer\u00eda que usa el que es KSoup 2.6.0 pero que esta descontinuado en la librer\u00eda que uso yo versi\u00f3n 3.0.0 donde la clase se sustituye por HttpTransportSE .<\/p>\n<blockquote><p>package com.pruebas;<\/p>\n<p>import org.ksoap2.SoapEnvelope;<br \/>\nimport org.ksoap2.serialization.SoapObject;<br \/>\nimport org.ksoap2.serialization.SoapSerializationEnvelope;<br \/>\nimport org.ksoap2.transport.AndroidHttpTransport;<\/p>\n<p>\npublic class Util {<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; \/\/ nuevos para WS<br \/>\n&nbsp;&nbsp;&nbsp; public static final String SOAP_ACTION =<br \/>\n&#8220;urn:webserv&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; public static final String METHOD = &#8220;saludo&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; public static final String NAMESPACE = &#8220;urn:webserv&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; public static final String ENDPOINTWS =&nbsp;<br \/>\n&#8220;https:\/\/www.lastdragon.net\/misarchivos\/webserv\/serv.php&#8221;;<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; \/**<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;* @param args<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;*\/<br \/>\n&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; \/\/ TODO Auto-generated method stub<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String r = response(&#8220;Jakoff&#8221;);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(r);<br \/>\n&nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; public static String response(String name){<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String res = null;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SoapObject<br \/>\nuserRequest=new SoapObject(NAMESPACE, METHOD);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\nuserRequest.addProperty(&#8220;nombre&#8221;, name);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nSoapSerializationEnvelope envelope = new<br \/>\nSoapSerializationEnvelope(SoapEnvelope.VER11);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nenvelope.setOutputSoapObject(userRequest);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nAndroidHttpTransport androidHttpTransport = new<br \/>\nAndroidHttpTransport(ENDPOINTWS);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroidHttpTransport.debug = true;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroidHttpTransport.call(SOAP_ACTION, envelope);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/la<br \/>\nrespuesta es una cadena<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res<br \/>\n= envelope.getResponse().toString();<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/si<br \/>\nla respuesta es un tipo de dato, o estructura compleja usa esto<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n\/\/SoapObject resp = (SoapObject)envelope.getResponse();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n\/\/String id = resp.getProperty(&#8220;id&#8221;).toString();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\ne.printStackTrace();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return res;<br \/>\n&nbsp;&nbsp;&nbsp; }<br \/>\n}<\/p><\/blockquote>\n<p>Lo importante del c\u00f3digo de Jakofff  es que muestra que aunque Ksoup esta pensado para ser usado en Android, tambi\u00e9n puede implementarse en un programa de consola de Java, ya sea texto o GUI con AWT o Swing<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este articulo se lo dedico a Jakofff Parker \u200fTwitter @jakofff , quien en mi momento de mayor frustraci\u00f3n al no poder consumir el WebServices en Java tuvo la paciencia y la amabilidad de escribirme un c\u00f3digo de ejemplo. El cual pr\u00e1cticamente era mi mismo c\u00f3digo, pero con ciertos detalles que si no fueran por el&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-733","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=733"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/733\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}