Передать параметр из Delphi Client в Java Webservice

1

У меня есть просто веб-сервис в 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;

Мой клиент нашел мой веб-сервер, но параметр равен нулю.

Кто-то может мне помочь?

Теги:
client
web-services

2 ответа

1
Лучший ответ

Ваш код задает параметры два раза с разными значениями:

  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)
1

Я тестировал его с 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 для сравнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню