
[RESUELTO] Delphi 7 Consumiento servicios web en java. Todo un show :S
#1
Escrito 28 abril 2011 - 03:46
Trataré de construir un par de tutoriales para conseguir una comunicación entre estos dos lenguajes.
Saludos
#2
Escrito 28 abril 2011 - 03:48
Salud OS
#3
Escrito 29 abril 2011 - 07:31
Son tipos de clase y arreglos de clases amigo. Esta es la declaración de la interface de mi webservice:¿ Que tipos y arreglos complejos amigo poli ?
Salud OS
[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¡¡¡¡¡¡¡
#4
Escrito 29 abril 2011 - 08:03
Salud OS
PD, eso me suena algo como Generics..........
#5
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
#6
Escrito 02 mayo 2011 - 03:31
Gracias
#7
Escrito 02 mayo 2011 - 05:13
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
#8
Escrito 03 mayo 2011 - 02:23
#9
Escrito 03 mayo 2011 - 08:32
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.
#10
Escrito 03 mayo 2011 - 08:36


#11
Escrito 03 mayo 2011 - 09:16
Saludos
#12
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
#13
Escrito 03 mayo 2011 - 10:00




#14
Escrito 03 mayo 2011 - 10:04
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?
#15
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.
#16
Escrito 03 mayo 2011 - 12:56
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
#17
Escrito 03 mayo 2011 - 01:07
#18
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.


Saludos amigo.
#19
Escrito 03 mayo 2011 - 01:18
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.
#20
Escrito 03 mayo 2011 - 04:58
// ************************************************************************ //
// 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.