Fórum Consumir este webservice #429054

19/11/2012

0

tenho a seguinte classe:

arrayEntrada = class(TRemotable)
private
Fvscode: WideString;
Fvsusername: WideString;
Fvspass: WideString;
Fongcode: WideString;
Fvalue: WideString;
Fname_: WideString;
Femail: WideString;
Fphone: WideString;
Fpurchasecode: WideString;
published
property vscode: WideString read Fvscode write Fvscode;
property vsusername: WideString read Fvsusername write Fvsusername;
property vspass: WideString read Fvspass write Fvspass;
property ongcode: WideString read Fongcode write Fongcode;
property value: WideString read Fvalue write Fvalue;
property name_: WideString read Fname_ write Fname_;
property email: WideString read Femail write Femail;
property phone: WideString read Fphone write Fphone;
property purchasecode: WideString read Fpurchasecode write Fpurchasecode;
end;


e a função:

function setDonation(const arrayParametros: arrayEntrada): WideString; stdcall;


como utilizar essa função passando os parametros da classe?

Obrigado desde já!
Murilo Junqueira

Murilo Junqueira

Responder

Posts

19/11/2012

Claudia Nogueira

Você pode declarar no uses do form a unit que contenha a classe que você citou.
Aí você declara uma variável do tipo arrayEntrada, carrega ela com as informações e chama a função.

Tenta assim:

procedure TForm2.BitBtn1Click(Sender: TObject);
Var
  arr : arrayEntrada;
begin
  arr.Fvscode := '';
  arr.Fvsusername := '';
  arr.Fvspass := '';
  arr.Fongcode := '';
  arr.Fvalue := '';
  arr.Fname_ := '';
  arr.Femail := '';
  arr.Fphone := '';
  arr.Fpurchasecode := '';
  setDonation(arr);
end;
Responder

Gostei + 0

22/11/2012

Rodolpho Silva

Se você usar o WSDL import do Delphi, ele já vai montar esse método para você...
Responder

Gostei + 0

23/11/2012

Murilo Junqueira

Obrigado por responder,
já importei o wsdl, já tenho o metodo, o tipo da variavel array

crio ela assim:

var
 teste : arrayEntrada;
begin
   teste := arrayEntrada.Create;
   

   teste.vscode := '1313';
   teste.vsusername := 'teste';
   teste.vspass := 'teste';
   teste.ongcode := '1383';
   teste.value := '5.0';
   teste.name_ := 'Murilo Junqueira';
   teste.email := 'darkducke@gmail.com';
   teste.phone := '(62)8119-0058';
   teste.purchasecode := 'x45s4d';

   xT := ObjSoap.setDonation(teste);
end;


o problema consigo enviar e receber a resposta do webservice, o problema é que a resposta é como se ele não tivesse recebido os parametros (vscode is required)

o webservice é em PHP
segue url caso queiram importar o wsld

http://www.net4help.org/ws/n4h.wsdl

por isso perguntei como enviaria esses parametros!

Obrigado novamente!

Responder

Gostei + 0

23/11/2012

Rodolpho Silva

Bem,

Pelo que você postou, você está fazendo da maneira correta, passando o objeto (array) como parâmetro do método SOAP. Como o WS é em PHP (e eu não conheço nada de PHP :( ) tem como você obter o XML que o WS está recebendo? Aí, pode ser mais fácil identificar o que está acontecendo. Acho que a linha inicial, a princípio é essa.
Responder

Gostei + 0

23/11/2012

Claudia Nogueira

Murilo quando importei no Delphi 7 e fiz o mesmo código que você, deu esse mesmo retorno.
Quando importei no Delphi XE, na Unit criada, onde estava String mudei pra WideString e ao executar a função o retorno foi diferente:

{"status":3,"pincode":"","smssent":0,"emailsent":0,"me...:"virtual store username \/password\/code do not match}

Você sabe como tem que ser o retorno?
Responder

Gostei + 0

26/11/2012

Murilo Junqueira

Murilo quando importei no Delphi 7 e fiz o mesmo código que você, deu esse mesmo retorno.
Quando importei no Delphi XE, na Unit criada, onde estava String mudei pra WideString e ao executar a função o retorno foi diferente:

{"status":3,"pincode":"","smssent":0,"emailsent":0,"me...:"virtual store username \/password\/code do not match}

Você sabe como tem que ser o retorno?


Olá Claudia, creio que o problema está ao importar o wsdl no delphi 7... vc passou os parametros citados a cima?
vscode, password etc?

o retorno deveria ser "donation successful" poderia me enviar a unit que vc criou para eu fazer uns testes?

Obrigado novamente!
Responder

Gostei + 0

27/11/2012

Murilo Junqueira

tb criei pelo delphi XE e pra mim deu o mesmo erro, como se os parâmetros não estivessem chegando ao webservice!

vc pode me passar a unit criada pelo seu import do delphi XE?

Obrigado!
Responder

Gostei + 0

27/11/2012

Claudia Nogueira

Murilo acabei de refazer aqui, pois eu não tinha mais o exemplo.
E olha minha surpresa: donation successfully.

Meu botão ficou assim:

procedure TForm2.BitBtn1Click(Sender: TObject);
var
teste : arrayEntrada;
resultado : String;
begin
teste := arrayEntrada.Create;
teste.vscode := '1313';
teste.vsusername := 'teste';
teste.vspass := 'teste';
teste.ongcode := '1383';
teste.value := '5.0';
teste.name_ := 'Murilo Junqueira';
teste.email := 'darkducke@gmail.com';
teste.phone := '(62)8119-0058';
teste.purchasecode := 'x45s4d';
 resultado := Getserver_setDonationPortType.setDonation(teste);
 ShowMessage(resultado);
end;


Olha a unit gerada no import:

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : C:\Users\claudia\Downloads\n4h.wsdl
//  >Import : C:\Users\claudia\Downloads\n4h.wsdl>0
// Encoding : ISO-8859-1
// Version  : 1.0
// (27/11/2012 11:14:18 - - $Rev: 28374 $)
// ************************************************************************ //

unit n4h;

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 Embarcadero types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]

  arrayEntrada         = class;                 { "urn:server.setDonation"[GblCplx] }



  // ************************************************************************ //
  // XML       : arrayEntrada, global, <complexType>
  // Namespace : urn:server.setDonation
  // ************************************************************************ //
  arrayEntrada = class(TRemotable)
  private
    Fvscode: string;
    Fvsusername: string;
    Fvspass: string;
    Fongcode: string;
    Fvalue: string;
    Fname_: string;
    Femail: string;
    Fphone: string;
    Fpurchasecode: string;
  published
    property vscode:       string  read Fvscode write Fvscode;
    property vsusername:   string  read Fvsusername write Fvsusername;
    property vspass:       string  read Fvspass write Fvspass;
    property ongcode:      string  read Fongcode write Fongcode;
    property value:        string  read Fvalue write Fvalue;
    property name_:        string  read Fname_ write Fname_;
    property email:        string  read Femail write Femail;
    property phone:        string  read Fphone write Fphone;
    property purchasecode: string  read Fpurchasecode write Fpurchasecode;
  end;


  // ************************************************************************ //
  // Name      : server.setDonationPortType
  // Namespace : urn:server.setDonation
  // soapAction: urn:server.setDonation#setDonation
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : rpc
  // binding   : server.setDonationBinding
  // service   : server.setDonation
  // port      : server.setDonationPort
  // URL       : http://www.net4help.org/ws/n4h.php
  // ************************************************************************ //
  server_setDonationPortType = interface(IInvokable)
  ['{B3AC45E3-A145-0476-BA43-E4CA9B349974}']
    function  setDonation(const arrayParametros: arrayEntrada): string; stdcall;
  end;

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


implementation
  uses SysUtils;

function Getserver_setDonationPortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): server_setDonationPortType;
const
  defWSDL = 'C:\Users\claudia\Downloads\n4h.wsdl';
  defURL  = 'http://www.net4help.org/ws/n4h.php';
  defSvc  = 'server.setDonation';
  defPrt  = 'server.setDonationPort';
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 server_setDonationPortType);
    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(server_setDonationPortType), 'urn:server.setDonation', 'ISO-8859-1', '', 'server.setDonationPortType');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(server_setDonationPortType), 'urn:server.setDonation#setDonation');
  RemClassRegistry.RegisterXSClass(arrayEntrada, 'urn:server.setDonation', 'arrayEntrada');
  RemClassRegistry.RegisterExternalPropName(TypeInfo(arrayEntrada), 'name_', 'name');

end.
Responder

Gostei + 0

27/11/2012

Claudia Nogueira

Esqueci de mencionar, fiz no XE e o retorno exato foi esse:

{"emailsent":1,"smssent":1,"status":1,"pincode":"138...:"donation successfully}
Responder

Gostei + 0

27/11/2012

Murilo Junqueira

Esqueci de mencionar, fiz no XE e o retorno exato foi esse:

{"emailsent":1,"smssent":1,"status":1,"pincode":"138...:"donation successfully}


Eu vi mesmo, recebi alguns sms de confirmação aqui....
Obrigado, irei fazer os testes e posto o resultado aqui!

Responder

Gostei + 0

27/11/2012

Murilo Junqueira

Deu certo, muitíssimo obrigado!

;)
Responder

Gostei + 0

27/11/2012

Claudia Nogueira

Por nada. :)

Deu certo, muitíssimo obrigado!

;)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar