Ir al contenido


Foto

[RESUELTO] Delphi 7 Consumiento servicios web en java. Todo un show :S


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

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 28 abril 2011 - 03:46

Pues, al fin logré que delphi consumiera un servicio web escrito en java que envia y devuelve tipos complejos y arreglos de tipo complejo. Solo que para lograrlo tuve que usar un framework cuya última versión vió la luz en 2004. Axis I.


Trataré de construir un par de tutoriales para conseguir una comunicación entre estos dos lenguajes.

Saludos
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 28 abril 2011 - 03:48

¿ Que tipos y arreglos complejos amigo poli ?

Salud OS
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 29 abril 2011 - 07:31

¿ Que tipos y arreglos complejos amigo poli ?
Salud OS

Son tipos de clase y arreglos de clases amigo. Esta es la declaración de la interface de mi webservice:

[java]

package com.pruebas.wscomplejo.ws;
import com.pruebas.wscomplejo.TPrueba;
import com.pruebas.wscomplejo.TRespuesta;

public interface Resultados {
  TPrueba ManPrueba(String Nombre );
  TPrueba EchoPrueba(TPrueba Prueba);
  TPrueba[] DamePruebas(String Nombre);
  TRespuesta DameRespuesta(String Nombre);
}

[/java]

Como puedes ver mi webservice publica cuatro métodos. En los tres primeros el resultado es del tipo TPrueba o un arreglo conteniendo una lista de TPrueba. El último método devuelve TRespuesta que está definido de  la siguiente manera:

[java]

public class TRespuesta {
  private java.lang.String estatus;
  private TPrueba prueba;
 
  public TRespuesta() {}
  public TRespuesta(java.lang.String estatus, TPrueba prueba) {
    this.estatus = estatus;
    this.prueba = prueba;
  }
  public java.lang.String getEstatus() {
    return this.estatus;
  }
  public void setEstatus(java.lang.String estatus) {
    this.estatus = estatus;
  }
  public TPrueba getPrueba() {
    return this.prueba;
  }
  public void setPrueba(TPrueba prueba) {
    this.prueba = prueba;
  }
}

[/java]


Cuando intenté hacer algo como esto usando JAX-WS tuve que declarar a mano los tipos en mi archivo de importación del wsdl y aún así tuve muchos problemas para lograr una comunicación al 100% entre delphi y el webservice escrito en java.

Luego, sabiendo que delphi unicamente soporta REST o JAX-RPC usé el framework AXIS 1.4 que me permitió una comunicación al 100% entre mi webservice y delphi.

Saludox¡¡¡¡¡¡¡

  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 29 abril 2011 - 08:03

Vaya, lo importante es que al final si hubo forma.

Salud OS

PD, eso me suena algo como Generics..........
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 29 abril 2011 - 09:09

Vaya, lo importante es que al final si hubo forma.

Salud OS

PD, eso me suena algo como Generics..........


Desgraciadamente amigo. Estoy trabajando con tecnologías obsoletas. Axis 1.4 fué liberado a producción en el 2004. Y esa fué su última versión pues el framework fué abandonado en pos de una nueva implementación de axis orientada a JAX-WS

Haré después pruebas con mi delphi 2010 y un webservice JAX-Ws para ver que tal anda el soporte en las nuevas versiones de delpui
  • 0

#6 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 02 mayo 2011 - 03:31

tengo una duda estoy consumiendo este web service pero veo que delphi 7 no me define las funciones como deben ser me las pone generica, https://forcogsa.dyn...gsaService?wsdl entonces estoy manualmente definiendo todo. hay alguna forma mas amigable.


Gracias



  • 0

#7 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 02 mayo 2011 - 05:13

Hola JuanPalmaSoft

El enlace que pones en tu mensaje direciona a un sitio reportado como potencialmente peligroso.

Edité tu mensaje para remover temporalmente el enlace.

Por favor, verifica el problema y si es un sitio de confianza volvemos a colocar el enlace.

Saludos

  • 0

#8 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 03 mayo 2011 - 02:23

Gracias por la preocupacion pero es un sitio  seguro es la empresa que brinda el timbrado de facturación electronica.


  • 0

#9 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 08:32

Epa,


Yo hace un tiempo logré hacer eso desde Delphi7


Mira


http://www.delphiacc...49354/#msg49354


Y es Axis2 lo que tengo del lado del servidor.
  • 0

#10 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 08:36

Por cierto... ¿qué hace este tema en BarTolo?  (b)  ¿ahora programamos entre cervezas? (b)
  • 0

#11 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 03 mayo 2011 - 09:16

Bien, pues he colocado nuevamente el enlace.

Saludos

  • 0

#12 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 03 mayo 2011 - 09:40

Por cierto... ¿qué hace este tema en BarTolo?    ¿ahora programamos entre cervezas?


Existe una mejor manera de hacerlo amigo?
jejejeje
  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 03 mayo 2011 - 10:00

Es por lo del título del hilo "consumiendo"... que lógicamnete el mejor lugar es Bartolo.  :D :D :D :D
  • 0

#14 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 10:04

Bueno el caso es que yo pude conectarme a servicios Web en Axis2 reciente desde delphi7 que es ya bastante viejito sin problemas con los tipos complejos definidos y todo.
Quedó publicado en nuestra Web http://m-lat.net/sit...res/delphi.html
Echa un ojo a ver si te sirve lo que hice.


PD. ¿dónde está mi cerveza?
  • 0

#15 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 03 mayo 2011 - 10:45

Bueno el caso es que yo pude conectarme a servicios Web en Axis2 reciente desde delphi7 que es ya bastante viejito sin problemas con los tipos complejos definidos y todo.
Quedó publicado en nuestra Web http://m-lat.net/sit...res/delphi.html
Echa un ojo a ver si te sirve lo que hice.


PD. ¿dónde está mi cerveza?


Wow, yo nomás no pude,  tuve que irme a Axis 1. Como hiciste para que el WSDL publicara los tipos de datos conforme al estándar que soporta delphi?


Sería grandioso que nos obsequiaras un ejemplo de un servicio web creado con axis 2. Para el cliente con delphi la cosa es más sencilla jejejeje.
  • 0

#16 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 12:56

Utilicé el método POJO "implementation first"

Una vulgar clase publica java con los métodos que me interesaban. En ningún momento toco api alguno de Axis2
[java]
public class InternationalGateway {
  public int[] sendManySMS(String user, String password, String[] srcs, String[] dests, String[] texts) throws Exception {
    ... el código necesario ...
  }
  public int sendOneSMS(String user, String password, String src, String dest, String text) throws Exception {
    ... el código necesario ...
  }
  .... y así para el resto
}
[/java]

Luego en un directorio junto con las classes META-INF/services.xml


<service>
    <description>
        La descripción ...
    </description>
    <!-- acá va nombre completo de la clase -->
    <parameter name="ServiceClass" locked="false">
        net.mlat.sms.international.InternationalGatewa
    </parameter>
    <operation name="sendManySMS">
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </operation>
    <operation name="sendOneSMS">
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </operation>
    ..... y así el resto de las operaciones ....
</service>


Comprimes las clases con ese META-INF en un jar. Le cambias la extensión a .aar y despliegas el servicio ya sea por la Web administrativa de Axis2 o dejandola caer en WEB-INF/services de la app Web de Axis2.

Suerte!

EDIT: así tal cual no funciona con Delphi7. Yo resolví ese problema acá http://www.delphiacc...49354/#msg49354
  • 0

#17 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 01:07

También puedes rescatar tu código usando el API JAX-WS. Sólo que los tipos de datos propios que definas como TPrueba deberán estar definidos como clase pública y cumplir con el JAXB. Es decir que tenga sobre la definición de la clase la anotación @XmlRootElement. Lo mismo aplica para el API JAX-RS (Rest).
  • 0

#18 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 03 mayo 2011 - 01:10

Utilicé el método POJO "implementation first"

Una vulgar clase publica java con los métodos que me interesaban. En ningún momento toco api alguno de Axis2
[java]
public class InternationalGateway {
  public int[] sendManySMS(String user, String password, String[] srcs, String[] dests, String[] texts) throws Exception {
    ... el código necesario ...
  }
  public int sendOneSMS(String user, String password, String src, String dest, String text) throws Exception {
    ... el código necesario ...
  }
  .... y así para el resto
}
[/java]

Luego en un directorio junto con las classes META-INF/services.xml


<service>
    <description>
        La descripción ...
    </description>
    <!-- acá va nombre completo de la clase -->
    <parameter name="ServiceClass" locked="false">
        net.mlat.sms.international.InternationalGatewa
    </parameter>
    <operation name="sendManySMS">
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </operation>
    <operation name="sendOneSMS">
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </operation>
    ..... y así el resto de las operaciones ....
</service>


Comprimes las clases con ese META-INF en un jar. Le cambias la extensión a .aar y despliegas el servicio ya sea por la Web administrativa de Axis2 o dejandola caer en WEB-INF/services de la app Web de Axis2.

Suerte!

EDIT: así tal cual no funciona con Delphi7. Yo resolví ese problema acá http://www.delphiacc...49354/#msg49354


Fijate que yo estuve usando el framework de Axis2 pero no logré una comunicacón efectiva. por eso me fuí a Axis 1.4 que implementa RPC y así conseguí una comunicación más clara y la unidad de importación del WSDL ya incluye tanto los tipos complejos como los simples.

Diferentes maneras de solucionar un problema. :p eso es lo bueno de JAVA. Aunque por el lado malo, te exige investigar y leer mucho más :p

Saludos amigo.
  • 0

#19 jorgeu

jorgeu

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 179 mensajes
  • LocationMaracaibo

Escrito 03 mayo 2011 - 01:18

Sí, Java al igual que C++ es muy severo con el principiante.

Pero las cosas están cambiando. Esos API nuevos JAX-WS y JAX-RS están muy limpios y claros.
También EJB 3 que hizo "de consumo humano" la tecnología J2EE.

Yo desde que descubrí esa manera con Axis2 casi todo lo hago así. Está difícil que lo haga de otra manera. Usando la IDE eclipse con el complemento WTP el asunto de axis2 se vuelve aún más sencillo porque puedes hacer trazas paso a paso entre otras ventajas.

  • 0

#20 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 03 mayo 2011 - 04:58

tengo un problema parecido con este web servicces que loe metedos me los genera muy genericos es que solo tengo que definir las clases?

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL    : https://forcogsa.dyn...gsaService?wsdl
// Encoding : UTF-8
// Version  : 1.0
// (03/05/2011 17:52:50 - 1.33.2.5)
// ************************************************************************ //

unit WSForcogsaService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:Timbrar        - "http://wservicios/"
  // !:TimbrarResponse - "http://wservicios/"
  // !:Autenticar      - "http://wservicios/"
  // !:AutenticarResponse - "http://wservicios/"
  // !:Cancelacion    - "http://wservicios/"
  // !:CancelacionResponse - "http://wservicios/"


  // ************************************************************************ //
  // Namespace : http://wservicios/
  // transport : http://schemas.xmlsoap.org/soap/http
  // style    : document
  // binding  : WSForcogsaPortBinding
  // service  : WSForcogsaService
  // port      : WSForcogsaPort
  // URL      : https://forcogsa.dyn...ForcogsaService
  // ************************************************************************ //
  WSForcogsa = interface(IInvokable)
  ['{70F39910-ABEF-85D4-DD5A-C1134AD30474}']
    function  Timbrar(const parameters: Timbrar): TimbrarResponse; stdcall;
    function  Autenticar(const parameters: Autenticar): AutenticarResponse; stdcall;
    function  Cancelacion(const parameters: Cancelacion): CancelacionResponse; stdcall;
  end;

function GetWSForcogsa(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WSForcogsa;


implementation

function GetWSForcogsa(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WSForcogsa;
const
  defWSDL = 'https://forcogsa.dyn...aService?wsdl';
  defURL  = 'https://forcogsa.dyn...rcogsaService';
  defSvc  = 'WSForcogsaService';
  defPrt  = 'WSForcogsaPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as WSForcogsa);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(WSForcogsa), 'http://wservicios/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WSForcogsa), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(WSForcogsa), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(WSForcogsa), ioLiteral);

end.


  • 0




IP.Board spam blocked by CleanTalk.