🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
10 messages
10 total messages Started by MKi Mon, 18 Mar 2019 11:56
WSDL dla kuriera DPD - co robię źle?
#346935
Author: MKi
Date: Mon, 18 Mar 2019 11:56
136 lines
4214 bytes
Witajcie,
przyszło mi napisać obsługę webservice klienta DPD.

Niestety pierwsze podejście i od razu problem, którego nie
potrafię przeskoczyć.

Na razie działam w sandboksie, oczywiście.

Utworzyłem w Delphi nowy projekt, zaimportowałem WSDL:
https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL

Wygenerował się plik DPDPackageObjServices1.pas

Napisałem krótki programik (na formie jest button i HTTPRIO),
na koniec tekstu załączam go w całości. Efektem działania
jest wyjątek przy wywołaniu findPostalCodeV1 z komunikatem
"Auth is null". Według dokumentacji ten komunikat pojawia się,
gdy nie jest w ogóle wypełniona struktura autoryzacji.

Bardzo podobnie wyglądający przykład PHP zamieszczony z dokumentacją
działa bez problemu.

Nie bardzo wiem, gdzie szukać błędu.

----------------------------------------------------

Działający przykład PHP:


<?php

class PostalCodeV1
{
     public $countryCode;
     public $zipCode;
}

class AuthDataV1
{
     public $login;
     public $masterFid;
     public $password;
}

$clientOBJ = new 
SoapClient("https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL",array('features' 
=> SOAP_SINGLE_ELEMENT_ARRAYS));

$authData = new AuthDataV1();
$authData->login = "test";
$authData->masterFid = "1234";
$authData->password = "thetu4Ee";

echo "Wyszukiwanie kodu pocztowego \n";
$param16 = new stdClass();
$postalCodeV1 = new PostalCodeV1();
$postalCodeV1->countryCode = 'PL';
$postalCodeV1->zipCode = '02274';
$param16->postalCodeV1 = $postalCodeV1;
$param16->authDataV1 = $authData;
$result = $clientOBJ->findPostalCodeV1($param16);
echo "Status operacji wyszukiwanie kodu pocztowego: " . 
$result->return->status . "";
?>

-------------------------------------------------------------------

Mój program:


unit Udpd;

interface

uses
   DPDPackageObjServices1,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
Forms,
   Dialogs, InvokeRegistry, Rio, SOAPHTTPClient, StdCtrls;

type
   TForm1 = class(TForm)
     HTTPRIO1: THTTPRIO;
     bTest: TButton;
     procedure FormCreate(Sender: TObject);
     procedure bTestClick(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
     { Private declarations }
     dpos : DPDPackageObjServices ;
   public
     { Public declarations }
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bTestClick(Sender: TObject);
var
   pc : postalCodeV1 ;
   ad : authDataV1 ;
   x : findPostalCodeResponseV1 ;
begin
   pc := postalCodeV1.Create ;
   pc.countryCode := 'PL' ;
   pc.zipCode := '02274' ;
   ad := authDataV1.Create ;
   ad.login := 'test' ;
   ad.masterFid := 1495 ;
   ad.password := 'thetu4Ee' ;
   x := dpos.findPostalCodeV1(pc,ad) ;
   ShowMessage(x.status) ;
   pc.Free ;
   ad.Free ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   dpos := GetDPDPackageObjServices(False,'',HTTPRIO1) ;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   if dpos <> nil then
     dpos._Release ;
end;

end.

---------------------------------------------------------
Pozdrowienia,
MKi
Re: WSDL dla kuriera DPD - co robię źle?
#346936
Author: zpksoft
Date: Tue, 19 Mar 2019 08:25
145 lines
4979 bytes
W dniu poniedziałek, 18 marca 2019 12:56:14 UTC+1 użytkownik MKi napisał:
> Witajcie,
> przyszło mi napisać obsługę webservice klienta DPD.
> 
> Niestety pierwsze podejście i od razu problem, którego nie
> potrafię przeskoczyć.
> 
> Na razie działam w sandboksie, oczywiście.
> 
> Utworzyłem w Delphi nowy projekt, zaimportowałem WSDL:
> https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL
> 
> Wygenerował się plik DPDPackageObjServices1.pas
> 
> Napisałem krótki programik (na formie jest button i HTTPRIO),
> na koniec tekstu załączam go w całości. Efektem działania
> jest wyjątek przy wywołaniu findPostalCodeV1 z komunikatem
> "Auth is null". Według dokumentacji ten komunikat pojawia się,
> gdy nie jest w ogóle wypełniona struktura autoryzacji.
> 
> Bardzo podobnie wyglądający przykład PHP zamieszczony z dokumentacją
> działa bez problemu.
> 
> Nie bardzo wiem, gdzie szukać błędu.
> 
> ----------------------------------------------------
> 
> Działający przykład PHP:
> 
> 
> <?php
> 
> class PostalCodeV1
> {
>      public $countryCode;
>      public $zipCode;
> }
> 
> class AuthDataV1
> {
>      public $login;
>      public $masterFid;
>      public $password;
> }
> 
> $clientOBJ = new 
> SoapClient("https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL",array('features' 
> => SOAP_SINGLE_ELEMENT_ARRAYS));
> 
> $authData = new AuthDataV1();
> $authData->login = "test";
> $authData->masterFid = "1234";
> $authData->password = "thetu4Ee";
> 
> echo "Wyszukiwanie kodu pocztowego \n";
> $param16 = new stdClass();
> $postalCodeV1 = new PostalCodeV1();
> $postalCodeV1->countryCode = 'PL';
> $postalCodeV1->zipCode = '02274';
> $param16->postalCodeV1 = $postalCodeV1;
> $param16->authDataV1 = $authData;
> $result = $clientOBJ->findPostalCodeV1($param16);
> echo "Status operacji wyszukiwanie kodu pocztowego: " . 
> $result->return->status . "";
> ?>
> 
> -------------------------------------------------------------------
> 
> Mój program:
> 
> 
> unit Udpd;
> 
> interface
> 
> uses
>    DPDPackageObjServices1,
>    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
> Forms,
>    Dialogs, InvokeRegistry, Rio, SOAPHTTPClient, StdCtrls;
> 
> type
>    TForm1 = class(TForm)
>      HTTPRIO1: THTTPRIO;
>      bTest: TButton;
>      procedure FormCreate(Sender: TObject);
>      procedure bTestClick(Sender: TObject);
>      procedure FormDestroy(Sender: TObject);
>    private
>      { Private declarations }
>      dpos : DPDPackageObjServices ;
>    public
>      { Public declarations }
>    end;
> 
> var
>    Form1: TForm1;
> 
> implementation
> 
> {$R *.dfm}
> 
> procedure TForm1.bTestClick(Sender: TObject);
> var
>    pc : postalCodeV1 ;
>    ad : authDataV1 ;
>    x : findPostalCodeResponseV1 ;
> begin
>    pc := postalCodeV1.Create ;
>    pc.countryCode := 'PL' ;
>    pc.zipCode := '02274' ;
>    ad := authDataV1.Create ;
>    ad.login := 'test' ;
>    ad.masterFid := 1495 ;
>    ad.password := 'thetu4Ee' ;
>    x := dpos.findPostalCodeV1(pc,ad) ;
>    ShowMessage(x.status) ;
>    pc.Free ;
>    ad.Free ;
> end;
> 
> procedure TForm1.FormCreate(Sender: TObject);
> begin
>    dpos := GetDPDPackageObjServices(False,'',HTTPRIO1) ;
> end;
> 
> procedure TForm1.FormDestroy(Sender: TObject);
> begin
>    if dpos <> nil then
>      dpos._Release ;
> end;
> 
> end.
> 
> ---------------------------------------------------------
> Pozdrowienia,
> MKi

A nie powinno być tak?:

x := dpos.findPostalCodeV1(ad) ; 

wygląda na to, że masz o jeden parametr za dużo

Paweł
Re: WSDL dla kuriera DPD - co robię źle?
#346937
Author: MKi
Date: Tue, 19 Mar 2019 09:46
20 lines
1521 bytes
> 
> A nie powinno być tak?:
> 
> x := dpos.findPostalCodeV1(ad) ;
> 
> wygląda na to, że masz o jeden parametr za dużo
> 
> Paweł
> 

No niestety, deklaracja funkcji w DPDPackageObjServices1.pas jest taka:

function  findPostalCodeV1(const postalCodeV1: postalCodeV1; const 
authDataV1: authDataV1): findPostalCodeResponseV1; stdcall;

Przecież trzeba jakoś podać kod pocztowy do sprawdzenia,
on jest właśnie w pierwszym parametrze.

Pozdrowienia,
MKi
Re: WSDL dla kuriera DPD - co robię źle?
#346938
Author: zpksoft
Date: Tue, 19 Mar 2019 10:47
48 lines
2633 bytes
W dniu wtorek, 19 marca 2019 10:46:59 UTC+1 użytkownik MKi napisał:
> > 
> > A nie powinno być tak?:
> > 
> > x := dpos.findPostalCodeV1(ad) ;
> > 
> > wygląda na to, że masz o jeden parametr za dużo
> > 
> > Paweł
> > 
> 
> No niestety, deklaracja funkcji w DPDPackageObjServices1.pas jest taka:
> 
> function  findPostalCodeV1(const postalCodeV1: postalCodeV1; const 
> authDataV1: authDataV1): findPostalCodeResponseV1; stdcall;
> 
> Przecież trzeba jakoś podać kod pocztowy do sprawdzenia,
> on jest właśnie w pierwszym parametrze.
> 
> Pozdrowienia,
> MKi

Dokładnie się temu nie przyjrzałem. Jednak w php jest to tylko jeden parametr: struktura zawierająca również kod pocztowy. Ja bym to spróbował zapisać mniej więcej tak:

TPostalCodeV1 = record
  countryCode,
  zipCode: string;
end;

TAuthDataV1 = record
 login,
 masterFid,
 password: string
end;

Tparam16 = record
  postalCodeV1: TpostalCodeV1;
  authDataV1: TauthDataV1;
end;

...

param16.postalCodeV1.countryCode := 'PL';
param16.postalCodeV1.zipCode := '02274';
param16.postalCodeV1.authDataV1 = authData;
result := clientOBJ.findPostalCodeV1(param16);

Paweł
Re: WSDL dla kuriera DPD - co robię źle?
#346940
Author: Piotr Brzeziński
Date: Wed, 20 Mar 2019 05:47
144 lines
5204 bytes
W dniu poniedziałek, 18 marca 2019 12:56:14 UTC+1 użytkownik MKi napisał:
> Witajcie,
> przyszło mi napisać obsługę webservice klienta DPD.
> 
> Niestety pierwsze podejście i od razu problem, którego nie
> potrafię przeskoczyć.
> 
> Na razie działam w sandboksie, oczywiście.
> 
> Utworzyłem w Delphi nowy projekt, zaimportowałem WSDL:
> https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL
> 
> Wygenerował się plik DPDPackageObjServices1.pas
> 
> Napisałem krótki programik (na formie jest button i HTTPRIO),
> na koniec tekstu załączam go w całości. Efektem działania
> jest wyjątek przy wywołaniu findPostalCodeV1 z komunikatem
> "Auth is null". Według dokumentacji ten komunikat pojawia się,
> gdy nie jest w ogóle wypełniona struktura autoryzacji.
> 
> Bardzo podobnie wyglądający przykład PHP zamieszczony z dokumentacją
> działa bez problemu.
> 
> Nie bardzo wiem, gdzie szukać błędu.
> 
> ----------------------------------------------------
> 
> Działający przykład PHP:
> 
> 
> <?php
> 
> class PostalCodeV1
> {
>      public $countryCode;
>      public $zipCode;
> }
> 
> class AuthDataV1
> {
>      public $login;
>      public $masterFid;
>      public $password;
> }
> 
> $clientOBJ = new 
> SoapClient("https://dpdservicesdemo.dpd.com.pl/DPDPackageObjServicesService/DPDPackageObjServices?WSDL",array('features' 
> => SOAP_SINGLE_ELEMENT_ARRAYS));
> 
> $authData = new AuthDataV1();
> $authData->login = "test";
> $authData->masterFid = "1234";
> $authData->password = "thetu4Ee";
> 
> echo "Wyszukiwanie kodu pocztowego \n";
> $param16 = new stdClass();
> $postalCodeV1 = new PostalCodeV1();
> $postalCodeV1->countryCode = 'PL';
> $postalCodeV1->zipCode = '02274';
> $param16->postalCodeV1 = $postalCodeV1;
> $param16->authDataV1 = $authData;
> $result = $clientOBJ->findPostalCodeV1($param16);
> echo "Status operacji wyszukiwanie kodu pocztowego: " . 
> $result->return->status . "";
> ?>
> 
> -------------------------------------------------------------------
> 
> Mój program:
> 
> 
> unit Udpd;
> 
> interface
> 
> uses
>    DPDPackageObjServices1,
>    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
> Forms,
>    Dialogs, InvokeRegistry, Rio, SOAPHTTPClient, StdCtrls;
> 
> type
>    TForm1 = class(TForm)
>      HTTPRIO1: THTTPRIO;
>      bTest: TButton;
>      procedure FormCreate(Sender: TObject);
>      procedure bTestClick(Sender: TObject);
>      procedure FormDestroy(Sender: TObject);
>    private
>      { Private declarations }
>      dpos : DPDPackageObjServices ;
>    public
>      { Public declarations }
>    end;
> 
> var
>    Form1: TForm1;
> 
> implementation
> 
> {$R *.dfm}
> 
> procedure TForm1.bTestClick(Sender: TObject);
> var
>    pc : postalCodeV1 ;
>    ad : authDataV1 ;
>    x : findPostalCodeResponseV1 ;
> begin
>    pc := postalCodeV1.Create ;
>    pc.countryCode := 'PL' ;
>    pc.zipCode := '02274' ;
>    ad := authDataV1.Create ;
>    ad.login := 'test' ;
>    ad.masterFid := 1495 ;
>    ad.password := 'thetu4Ee' ;
>    x := dpos.findPostalCodeV1(pc,ad) ;
>    ShowMessage(x.status) ;
>    pc.Free ;
>    ad.Free ;
> end;
> 
> procedure TForm1.FormCreate(Sender: TObject);
> begin
>    dpos := GetDPDPackageObjServices(False,'',HTTPRIO1) ;
> end;
> 
> procedure TForm1.FormDestroy(Sender: TObject);
> begin
>    if dpos <> nil then
>      dpos._Release ;
> end;
> 
> end.
> 
> ---------------------------------------------------------
> Pozdrowienia,
> MKi

Cześć

A może to problem wersji Delphi, którego używasz?
Zrobiłem to co napisałeś w XE5 i nie było żadnego problemu a x.status dostał wartość 'OK'.

Piotr
Re: WSDL dla kuriera DPD - co robię źle?
#346941
Author: MKi
Date: Wed, 20 Mar 2019 07:54
18 lines
1752 bytes
> 
> Cześć
> 
> A może to problem wersji Delphi, którego używasz?
> Zrobiłem to co napisałeś w XE5 i nie było żadnego problemu a x.status dostał wartość 'OK'.
> 
> Piotr
> 

No faktycznie, używam Delphi 2009.
Ale to jest moje drugie podejście do WSDL, pierwsze działa
bez problemów (komunikacja z Elektronicznym Nadawcą
Poczty Polskiej).

Co może być nie tak w tej wersji?

Pozdrowienia,
MKi
Re: WSDL dla kuriera DPD - co robię źle?
#346939
Author: MKi
Date: Wed, 20 Mar 2019 07:57
59 lines
2951 bytes
-- Wiadomość oryginalna (wysłana  19.03.2019 11:47) --
> W dniu wtorek, 19 marca 2019 10:46:59 UTC+1 użytkownik MKi napisał:
>>>
>>> A nie powinno być tak?:
>>>
>>> x := dpos.findPostalCodeV1(ad) ;
>>>
>>> wygląda na to, że masz o jeden parametr za dużo
>>>
>>> Paweł
>>>
>>
>> No niestety, deklaracja funkcji w DPDPackageObjServices1.pas jest taka:
>>
>> function  findPostalCodeV1(const postalCodeV1: postalCodeV1; const
>> authDataV1: authDataV1): findPostalCodeResponseV1; stdcall;
>>
>> Przecież trzeba jakoś podać kod pocztowy do sprawdzenia,
>> on jest właśnie w pierwszym parametrze.
>>
>> Pozdrowienia,
>> MKi
> 
> Dokładnie się temu nie przyjrzałem. Jednak w php jest to tylko jeden parametr: struktura zawierająca również kod pocztowy. Ja bym to spróbował zapisać mniej więcej tak:
> 
> TPostalCodeV1 = record
>    countryCode,
>    zipCode: string;
> end;
> 
> TAuthDataV1 = record
>   login,
>   masterFid,
>   password: string
> end;
> 
> Tparam16 = record
>    postalCodeV1: TpostalCodeV1;
>    authDataV1: TauthDataV1;
> end;
> 
> ...
> 
> param16.postalCodeV1.countryCode := 'PL';
> param16.postalCodeV1.zipCode := '02274';
> param16.postalCodeV1.authDataV1 = authData;
> result := clientOBJ.findPostalCodeV1(param16);
> 
> Paweł
> 

Ale przecież muszę dostosować się z parametrami do deklaracji funkcji,
która została wygenerowana przez Delphi na podstawie linka WSDL.
Taka konstrukcja się w ogóle nie skompiluje!

Zresztą Piotr napisał, w XE5 mój programik działa bez problemów.

Pozdrowienia,
MKi
Re: WSDL dla kuriera DPD - co robię źle?
#346942
Author: moxi
Date: Wed, 20 Mar 2019 08:15
29 lines
1786 bytes
W dniu 2019-03-20 o 08:54, MKi pisze:
>>
>> Cześć
>>
>> A może to problem wersji Delphi, którego używasz?
>> Zrobiłem to co napisałeś w XE5 i nie było żadnego problemu a x.status 
>> dostał wartość 'OK'.
>>
>> Piotr
>>
> 
> No faktycznie, używam Delphi 2009.
> Ale to jest moje drugie podejście do WSDL, pierwsze działa
> bez problemów (komunikacja z Elektronicznym Nadawcą
> Poczty Polskiej).
> 
> Co może być nie tak w tej wersji?
> 
> Pozdrowienia,
> MKi
> 

z tego co pamietam to do ktorejs wersji kreator nie radzil sobie z xsd, 
zapisz wsdl i wklej do niego xsd a dopiero wtedy na podstawie tak 
spreparowanego pliku wygeneruj pas

-- 
Pozdrawiam,
moxi
Re: WSDL dla kuriera DPD - co robię źle?
#346943
Author: MKi
Date: Wed, 20 Mar 2019 08:59
26 lines
1851 bytes
> z tego co pamietam to do ktorejs wersji kreator nie radzil sobie z xsd, 
> zapisz wsdl i wklej do niego xsd a dopiero wtedy na podstawie tak 
> spreparowanego pliku wygeneruj pas
> 

Zrobiłem tak:

Plik wsdl pobrałem, wywaliłem z niego sekcję
<xsd:schema>
...
</xsd:schema>

W to miejsce wkleiłem zawartość xsd - bez nagłówka xml:
<xs:schema xmlns:tns="http://dpdservices.dpd.com.pl/" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" 
targetNamespace="http://dpdservices.dpd.com.pl/">
...
</xs:schema>

Plik pas wygenerował się identyczny (oprócz komentarzy w nagłówku),
program też wykonuje się identycznie, niestety.

Coś zrobiłem nie tak czy nie tędy droga?

Pozdrowienia,
MKi
Re: WSDL dla kuriera DPD - co robię źle?
#346944
Author: MKi
Date: Wed, 20 Mar 2019 09:04
14 lines
1513 bytes
> Cześć
> 
> A może to problem wersji Delphi, którego używasz?
> Zrobiłem to co napisałeś w XE5 i nie było żadnego problemu a x.status dostał wartość 'OK'.
> 
> Piotr
> 
Mam prośbę, mógłbyś podesłać mi swój projekt w źródłach?
Pewnie DPDPackageObjServices1.pas wystarczy.
Spróbowałbym go przekompilować moim Delhi 2009, może będzie działać?
Mój adres z nagłówka działa, trzeba go tylko troszkę oczyścić.

Pozdrowienia,
MKi
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads