У меня есть просто веб-сервис в java, работающий в GlassFish 3.1.2:
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class TesteDeWSComDelphi {
/**
* WebMethod
*
* @param s
* @return
*/
@WebMethod(operationName = "operacaoPrincipal")
public String operacao1(String s) {
System.out.println("Dados passados: " + s);
return "Vc enviou para operação1 " + s;
}
}
Итак, я использовал WSDL Importer из Delphi для генерации моего клиента. Генерируемый код:
unit TesteDeWSComDelphiService1;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
TesteDeWSComDelphi = interface(IInvokable)
['{07BD6B8D-0E3D-9A88-AF46-D07FD1DB6D5B}']
function operacaoPrincipal(s: WideString): WideString; stdcall;
end;
function GetTesteDeWSComDelphi(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): TesteDeWSComDelphi;
implementation
function GetTesteDeWSComDelphi(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO):
TesteDeWSComDelphi;
const
defWSDL = 'http://10.20.137.54:8080/mavenproject1/TesteDeWSComDelphiService?wsdl';
defURL = 'http://10.20.137.54:8080/mavenproject1/TesteDeWSComDelphiService';
defSvc = 'TesteDeWSComDelphiService';
defPrt = 'TesteDeWSComDelphiPort';
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 TesteDeWSComDelphi);
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.RegisterInvokeOptions(TypeInfo(TesteDeWSComDelphi), ioDocument);
InvRegistry.RegisterInterface(TypeInfo(TesteDeWSComDelphi), 'http://ws.jus.br/', 'UTF-8');
InvRegistry.RegisterInvokeOptions(TypeInfo(TesteDeWSComDelphi), ioDefault);
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TesteDeWSComDelphi), '');
end.
Когда я делаю:
procedure TForm1.TestarClick(Sender: TObject);
var
servico:TesteDeWSComDelphi;
valor:string;
begin
servico:=GetTesteDeWSComDelphi(False, '');
valor:=edt1.Text;
Dialogs.ShowMessage('Enviando "' + valor+ '"');
retorno.Text := servico.operacaoPrincipal(valor);
end;
Мой клиент нашел мой веб-сервер, но параметр равен нулю.
Кто-то может мне помочь?
Ваш код задает параметры два раза с разными значениями:
InvRegistry.RegisterInvokeOptions(TypeInfo(TesteDeWSComDelphi), ioDocument);
InvRegistry.RegisterInvokeOptions(TypeInfo(TesteDeWSComDelphi), ioDefault);
Удалите первый и повторите попытку, чтобы узнать, помогает ли это:
InvRegistry.RegisterInvokeOptions(TypeInfo(TesteDeWSComDelphi), ioDefault);
Если это не устраняет проблему, измените
@SOAPBinding(style = SOAPBinding.Style.RPC)
в
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
Я тестировал его с Delphi 2009 и GlassFish 4.
Импортер Delphi WSDL возвратил другой результат, чем ваш:
unit EchoWSService;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
EchoWS = interface(IInvokable)
['{F0D4A733-3EB7-44F0-47B7-FC0B5E5B6576}']
function echo(const arg0: string): string; stdcall;
end;
function GetEchoWS(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): EchoWS;
implementation
uses SysUtils;
function GetEchoWS(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): EchoWS;
const
defWSDL = 'http://127.0.0.1:8080/mavenproject1/EchoWSService?wsdl';
defURL = 'http://127.0.0.1:8080/mavenproject1/EchoWSService';
defSvc = 'EchoWSService';
defPrt = 'EchoWSPort';
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 EchoWS);
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(EchoWS), 'http://echows/', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(EchoWS), '');
end.
Как видите, есть различия в разделе инициализации.
Клиентский код Delphi:
procedure TForm7.Button1Click(Sender: TObject);
var
servico: EchoWS;
valor: string;
begin
servico := GetEchoWS;
valor := 'Hello';
Dialogs.ShowMessage('Send "' + valor + '"');
Edit1.Text := servico.echo(valor);
end;
И код веб-службы Java:
package echows;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class EchoWS {
@WebMethod(operationName = "echo")
public String echo(String s) {
System.out.println("Received: " + s);
return "Echo: " + s;
}
}
Веб-служба возвращает ожидаемый результат. Анализ различий - это совсем другое дело, возможно, это полезно для захвата трафика HTTP с помощью Fiddler2 для сравнения.