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?
Author: MKi
Date: Mon, 18 Mar 2019 11:56
Date: Mon, 18 Mar 2019 11:56
136 lines
4214 bytes
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?
Author: zpksoft
Date: Tue, 19 Mar 2019 08:25
Date: Tue, 19 Mar 2019 08:25
145 lines
4979 bytes
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?
Author: MKi
Date: Tue, 19 Mar 2019 09:46
Date: Tue, 19 Mar 2019 09:46
20 lines
1521 bytes
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?
Author: zpksoft
Date: Tue, 19 Mar 2019 10:47
Date: Tue, 19 Mar 2019 10:47
48 lines
2633 bytes
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?
Author: Piotr Brzeziński
Date: Wed, 20 Mar 2019 05:47
Date: Wed, 20 Mar 2019 05:47
144 lines
5204 bytes
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?
Author: MKi
Date: Wed, 20 Mar 2019 07:54
Date: Wed, 20 Mar 2019 07:54
18 lines
1752 bytes
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?
Author: MKi
Date: Wed, 20 Mar 2019 07:57
Date: Wed, 20 Mar 2019 07:57
59 lines
2951 bytes
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?
Author: moxi
Date: Wed, 20 Mar 2019 08:15
Date: Wed, 20 Mar 2019 08:15
29 lines
1786 bytes
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?
Author: MKi
Date: Wed, 20 Mar 2019 08:59
Date: Wed, 20 Mar 2019 08:59
26 lines
1851 bytes
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?
Author: MKi
Date: Wed, 20 Mar 2019 09:04
Date: Wed, 20 Mar 2019 09:04
14 lines
1513 bytes
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