Ir al contenido


Foto

¿Alguien podria guiarme en llamar a web service en Android creado en Delphi XE?


  • Por favor identifícate para responder
3 respuestas en este tema

#1 clauxs88

clauxs88

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 06 septiembre 2013 - 12:50

Buenas compañeros, veo en la mayoría de los tutos la forma de implementar el consumo, en Android, de un WebService creado en .Net. Mi consulta seria como implementarlo pero con un Servicio hecho en Delphi. Les paso el XML de mi WS.

This XML file does not appear to have any style information associated with it. The document tree is shown below.

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlso...org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlso...soap/encoding/" xmlns:mime="http://schemas.xmlso...org/wsdl/mime/" xmlns:ns1="urn:ServicioAndroidIntf" name="IServicioAndroidservice" targetNamespace="http://tempuri.org/">
<types>
<xs:schema xmlns="urn:ServicioAndroidIntf" targetNamespace="urn:ServicioAndroidIntf">
<xs:complexType name="trParametroCliente">
<xs:sequence>
<xs:element name="NombreCliente" type="xs:string"/>
<xs:element name="Telefono" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="trDet_Clientes">
<xs:sequence>
<xs:element name="Cli_CantFilas" type="xs:int"/>
<xs:element name="DetClientes" type="ns1:TArrayDetClientes"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TArrayDetClientes">
<xs:complexContent>
<xs:restriction base="soapenc:Array">
<xs:sequence/>
<xs:attribute xmlns:n1="http://schemas.xmlsoap.org/wsdl/" ref="soapenc:arrayType" n1:arrayType="ns1:TArrayClientes[]"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="TArrayClientes">
<xs:sequence>
<xs:element name="DETId_Cliente" type="xs:int"/>
<xs:element name="DETNombre_Cliente" type="xs:string"/>
<xs:element name="DETTelefono_Cliente" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</types>
<message name="InsConsultaCliente0Request">
<part name="ParametrosPed" type="ns1:trParametroCliente"/>
</message>
<message name="InsConsultaCliente0Response">
<part name="return" type="ns1:trDet_Clientes"/>
</message>
<portType name="IServicioAndroid">
<operation name="InsConsultaCliente">
<input message="tns:InsConsultaCliente0Request"/>
<output message="tns:InsConsultaCliente0Response"/>
</operation>
</portType>
<binding name="IServicioAndroidbinding" type="tns:IServicioAndroid">
<soap:binding style="rpc" transport="http://schemas.xmlso...rg/soap/http"/>
<operation name="InsConsultaCliente">
<soap:operation soapAction="urn:ServicioAndroidIntf-IServicioAndroid#InsConsultaCliente" style="rpc"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlso...soap/encoding/" namespace="urn:ServicioAndroidIntf-IServicioAndroid"/>
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlso...soap/encoding/" namespace="urn:ServicioAndroidIntf-IServicioAndroid"/>
</output>
</operation>
</binding>
<service name="IServicioAndroidservice">
<port name="IServicioAndroidPort" binding="tns:IServicioAndroidbinding">
<soap:address location="http://192.168.66.18...vicioAndroid"/>
</port>
</service>
</definitions>

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 septiembre 2013 - 01:09

Hola clauxs88

Con Delphi lo haces igual que siempre, la diferencia es que necesitas; primero, Delphi XE5, después, configurar el entorno de desarrollo y al final desarrollar el programa como se suele hacer un cliente que consumirá el servicio Web normalito.

En unos días espero ya poder publicar un tutorial de como hacer un cliente que consuma un servicio Web en Android, igual que lo hice con iOS.

Saludos
  • 0

#3 clauxs88

clauxs88

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 06 septiembre 2013 - 02:02

Gracias Egostar por la pronta respuesta, a lo que iba era que trato de consumir el servicio web usando el ADT de andoid (Eclipse).
Revise varios tutoriales en los que implementan una libredia KSOAP dentro el eclipse, hasta aquí sin dramas. Mi problema radica en la sección de los NAMESPACE, URL, METHOD_NAME , SOAP_ACTION; no se si los coloco como deben ser porque me falla.



[cpp]private class TareaWSInsercion2 extends AsyncTask<String,Integer,Boolean> {

private Cliente[] listaClientes;

    protected Boolean doInBackground(String... params) {
   
    boolean resul = true;

    /*final String NAMESPACE = "http://sgoliver.net/";
final String URL="http://10.0.2.2:1473...Clientes.asmx";
final String METHOD_NAME = "NuevoClienteObjeto";
final String SOAP_ACTION = "http://sgoliver.net/...-----ORIGINAL*/

    final String NAMESPACE = "http://192.168.66.185:8033/";
final String URL="http://192.168.66.18...rvicioAndroid";
final String METHOD_NAME = "InsConsultaCliente";
final String SOAP_ACTION = "http://192.168.66.18...nsultaCliente";

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

Cliente cli = new Cliente();
cli.nombre = txtNombre.getText().toString();
cli.telefono = Integer.parseInt(txtTelefono.getText().toString());

PropertyInfo pi = new PropertyInfo();
        pi.setName("cliente");
        pi.setValue(cli);
        pi.setType(cli.getClass());
       
request.addProperty(pi); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = false;

envelope.setOutputSoapObject(request);

envelope.addMapping(NAMESPACE, "Cliente", cli.getClass());

HttpTransportSE transporte = new HttpTransportSE(URL);

try
{
transporte.call(SOAP_ACTION, envelope);

SoapPrimitive resultado_xml =(SoapPrimitive)envelope.getResponse();
String res = resultado_xml.toString();

if(!res.equals("1"))
resul = false;
}
catch (Exception e)
{
resul = false;


        return resul;
    }[/cpp]
  • 0

#4 nico0689

nico0689

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 05 noviembre 2013 - 11:09

Buenas. yo estoy tratando de desarrollar algo parecido y tengo un WS desarrollado en PHP y el wsdl, el mismo que se encuentra en el taller practico de la pagina de http://www.cesarcancino.com/

Mi WebServices WSDL:



delphi
  1. <?xml version='1.0' encoding='UTF-8'?> 
  2. <definitions name="Service"
  3. targetNamespace="urn:Service"
  4. xmlns:typens="urn:Service" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  5. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  6. xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  7. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  8. xmlns="http://schemas.xmlsoap.org/wsdl/">
  9.       <!--acá construyo el mensaje SOAP-->
  10.     <message name='getUser'>
  11.   <part name='n1' type='xsd:string'/>
  12.   <part name='n2' type='xsd:string' />
  13. </message>
  14.  
  15.         <message name="getUserResponse">
  16.                 <part name="getUserReturn" type="xsd:string"/>
  17.         </message>
  18.     <!--************************-->
  19.  
  20. <!-- realiza el formateo -->
  21.         <portType name="UserFacadePortType">
  22.                 <operation name="getUser">
  23.                         <input message="typens:getUser"/>
  24.                         <output message="typens:getUserResponse"/>
  25.                 </operation>
  26.         </portType>
  27.         <binding name="UserFacadeBinding" type="typens:UserFacadePortType">
  28.  
  29.                 <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  30.        
  31.         <operation name="getUser">
  32.                         <soap:operation soapAction="urn:UserFacadeAction"/>
  33.                         <input>
  34.                                 <soap:body namespace="urn:Service" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  35.                         </input>
  36.                         <output>
  37.                                 <soap:body namespace="urn:Service" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  38.                         </output>
  39.                 </operation>
  40.         </binding>
  41. <service name="ServiceService">
  42.                 <port name="UserFacadePort" binding="typens:UserFacadeBinding">
  43.                         <soap:address location="http://camisetascorrientes.com.ar/webservices/servidor.php"/>
  44.                 </port>
  45.         </service>
  46. </definitions>




Mi Clase en Java para android:



delphi
  1. package catequesis.android.tfa.syncro;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.ksoap2.SoapEnvelope;
  6. import org.ksoap2.serialization.SoapObject;
  7. import org.ksoap2.serialization.SoapPrimitive;
  8. import org.ksoap2.serialization.SoapSerializationEnvelope;
  9. import org.ksoap2.transport.HttpTransportSE;
  10. import org.xmlpull.v1.XmlPullParserException;
  11.  
  12. public class Sincronizacion
  13. {
  14. //Constantes para la invocacion del web service
  15. private static final String NAMESPACE = "http://camisetascorrientes.com.ar/webservices/service.wsdl";
  16. private static final String URL="http://camisetascorrientes.com.ar/webservices/service.wsdl";
  17. private static final String METHOD_NAME = "getUser";
  18. private static final String SOAP_ACTION = "http://camisetascorrientes.com.ar/webservices/servidor.php";
  19.  
  20. private static SoapSerializationEnvelope envelope;
  21. private static SoapObject request;
  22. private static SoapPrimitive resultsRequestSOAP;
  23.  
  24. public static void Sincronizar()
  25. {
  26. /*Se crea un objeto SoapObject para poder realizar la peticion
  27. para consumir el ws SOAP. El constructor recibe
  28. el namespace. Por lo regular el namespace es el dominio
  29. donde se encuentra el web service*/
  30.  
  31. request = new SoapObject(NAMESPACE, METHOD_NAME);
  32. request.addProperty("n1","3");
  33. request.addProperty("n2","3");
  34.  
  35. /*Se crea un objeto SoapSerializationEnvelope para serealizar la
  36. peticion SOAP y permitir viajar el mensaje por la nube
  37. el constructor recibe la version de SOAP*/
  38.  
  39. envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
  40. envelope.dotNet = false; //se asigna true para el caso de que el WS sea de dotNet
  41.  
  42. //Se envuelve la peticion soap
  43. envelope.setOutputSoapObject(request);
  44.  
  45. //Objeto que representa el modelo de transporte
  46. //Recibe la URL del ws
  47. HttpTransportSE transporte = new HttpTransportSE(URL);
  48. try
  49. {
  50. //Hace la llamada al ws
  51. transporte.call(SOAP_ACTION, envelope);
  52.  
  53. //Se crea un objeto SoapPrimitive y se obtiene la respuesta
  54. //de la peticion
  55. resultsRequestSOAP = (SoapPrimitive)envelope.getResponse();
  56.  
  57. }
  58. catch (IOException e1)
  59. {
  60. e1.printStackTrace();
  61. }
  62. catch (XmlPullParserException e2)
  63. {
  64. e2.printStackTrace();
  65. }
  66.  
  67.  
  68. //Almacenamos el resultado en un String ya que lo que represa
  69. //el ws es una cadena json, representando una lista AndroidOS
  70. //de objetos del tipo
  71. String  strJSON = resultsRequestSOAP.toString();
  72. }
  73. }




Bueno, como podes trato de consumir este webservices desarrollado en PHP pero estoy teniendo un problema que no estoy pudiendo resolverlo y es que me tira este error en el segundo catch.

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlso...elope/}Envelope (position:START_TAG <{http://www.w3.org/20...chema}xs:schema targetNamespace='http://schemas.xmlsoap.org/soap/envelope/'>@4:50 in java.io.InputStreamReader@45f92068)


Estoy mas que seguro que algo esta mal en la forma del XML, pero ya trate de muchas formas y no consigo solucionarlo. Si alguien ya paso por esto o me puede dar una mano con gusto se agradeceria.












  • 0




IP.Board spam blocked by CleanTalk.