Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pomoc z SOAP

341 views
Skip to first unread message

jh

unread,
May 31, 2013, 7:17:52 AM5/31/13
to
Jestem zielony, jeżeli chodzi o SOAP. Chcę odczytać dane, które podaje
serwer SOAP. Serwer działa w sieci lokalnej na Windows Server 2008 (jest
IIS, MS SQL). Niech będzie, że pod adresem:
http://mydataserver/soapserver dostępna jest ta usługa. Pod adresem
http://mydataserver/soapserver/soapbrowser mam taką prostą przeglądarkę
danych dostarczoną przez producenta. Dostęp do niej wymaga zalogowania,
tu wszystko działa, więc serwer na pewno odpowiada.

W Delphi (XE2, Windows 7 64 Bit) importuje do projektu plik WSDL z
serwera (http://mydataserver/soapserver/soapserver.wsdl). Jest dosyć
pokaźny, fragmenty tego, co istotne są poniżej. Zestaw danych, które
chcę pobierać to obiekt klasy ITypeDataSet1Title. Do obsługi tych danych
mam interface SoapDataSet1LibrarySoapPort.

type
ITypeDataSet1Title = class(TRemotable)
private
function GetID: Integer;
procedure SetID(Value: Integer);
public
destructor Destroy; override;
published
property Id: Integer read GetId write SetId;
// inne własności
end;

SoapDataSet1LibrarySoapPort = interface(IInvokable)
['{7BB8B4B4-641E-0D31-BCC7-22BA9482F755}']
procedure Get(var pIType: ITypeDataSet1Title); stdcall;
procedure Update(var pIType: ITypeDataSet1Title); stdcall;
procedure Insert(var pIType: ITypeDataSet1Title); stdcall;
procedure Delete(const pIType: ITypeDataSet1Title); stdcall;
end;

function GetSoapDataSet1LibrarySoapPort(UseWSDL: Boolean; Addr: string;
HTTPRIO: THTTPRIO): SoapDataSet1LibrarySoapPort;
const
defWSDL = 'http://mydataserver/soapserver/soapserver.wsdl';
defURL = 'http://localhost:8080/soapserver/SoapServer.WSDL';
defSvc = 'SoapServer';
defPrt = 'SoapDataSet1LibrarySoapPort';
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 SoapDataSet1LibrarySoapPort);
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;

Odpowiednie InvRegistry.RegisterInterface,
InvRegistry.RegisterDefaultSOAPAction, InvRegistry.RegisterMethodInfo
itd. są w initialization.

Serwer wymaga logowania, ja chcę odebrać dane typu ITypeDataSet1Title.
Podpowie mi ktoś jak to zrobić? To, co wygoogle'ałem to przykłady, w
których wyglądało to stokroć prościej, żadnego logowania... No i
niewiele mi to pomogło. To, czego próbowałem nie będę wpisywał, bo
obciach ;)

jh

jh

unread,
Jun 3, 2013, 3:10:14 PM6/3/13
to
W dniu 2013-05-31 13:17, jh pisze:
> Serwer wymaga logowania

Podpowie ktoś? THTTPRIO.HTTPWebNode Password/UserName nic nie dają :(

jh

R.e.m.e.K

unread,
Jun 3, 2013, 4:10:24 PM6/3/13
to
Dnia Mon, 03 Jun 2013 21:10:14 +0200, jh napisał(a):

>> Serwer wymaga logowania
>
> Podpowie ktoś? THTTPRIO.HTTPWebNode Password/UserName nic nie dają :(

Ale to logowanie nie jest na poziomie webserwisu tylko protokolu http?

--
pozdro
R.e.m.e.K

jh

unread,
Jun 3, 2013, 6:26:21 PM6/3/13
to
W dniu 2013-06-03 22:10, R.e.m.e.K pisze:
Teraz nie mam dostępu do tego serwera. Ale podsunąłeś mi pomysł. Może
namierzę tam jakiś interface z czymś do logowania... Sprawdzę jutro,
dzięki za hint.

jh

sebastia...@gmail.com

unread,
Sep 10, 2013, 2:28:26 AM9/10/13
to
A mógłbyś napisać jak sobie z tym poradziłeś bo stoję przed podobnym problemem.
Dzięki

PZD
Seba

jh

unread,
Sep 10, 2013, 3:19:10 AM9/10/13
to
W dniu 10.09.2013 08:28, sebastia...@gmail.com pisze:
> A mógłbyś napisać jak sobie z tym poradziłeś bo stoję przed podobnym problemem.

Przyczyna okazała się prostsza niż sądziłem i obawiam się, że Ci nie
pomoże. Po pierwsze wyszło, że serwer był źle skonfigurowany. Po drugie
nie wymaga logowania, a przynajmniej nie tu i nie do tego. Jest
potrzebne jedynie do uzyskania ID sesji używanej jako parametr do
specyficznych operacji. Swoją drogą masę problemów miałem z racji tego,
że service SOAPa pracował na MS Server 2008 R2. Oprogramowanie nie było
zaktualizowane do zmian wprowadzony przez MS i po przeniesieniu na
Server 2003 wyjątki jak się pojawiały to przynajmniej wskazywały na
właściwy błąd i mogłem je skorygować. Co ciekawe, po imporcie wsdl
dostałem nieco inne interfejsy w Delphi. Pozostał mi jedynie problem
taki, że przy dużej ilości zapytań po jakimś czasie pojawia się błąd
logowania do SQL Servera, ale wystarczy, że komunikat z wyjątkiem (testy
w IDE) powisi kilkanaście sekund, kontynuuję i działa, potem za jakiś
czas znowu błąd się pojawia. Mało to regularne i jak zapytań nie jest
zbyt wiele to go nie ma. Stawiam, że to jakieś zabezpieczenie przed
floodowaniem serwera ;)

jh

sebastia...@gmail.com

unread,
Sep 10, 2013, 6:48:08 AM9/10/13
to
Dzięki za odpowiedź. Dalej grzebię.

PZD
Seba

R.e.m.e.K

unread,
Sep 10, 2013, 6:56:35 AM9/10/13
to
Dnia Tue, 10 Sep 2013 03:48:08 -0700 (PDT), sebastia...@gmail.com
napisał(a):

> Dzięki za odpowiedź. Dalej grzebię.

Moze bys po ludzku zalozyl watek i opisal z czym masz problem? Nie ma
gwarancji, ze Ci ktos pomoze, ale jest takowa szansa.

--
pozdro
R.e.m.e.K

sebastia...@gmail.com

unread,
Sep 10, 2013, 7:18:57 AM9/10/13
to
> Moze bys po ludzku zalozyl watek i opisal z czym masz problem? Nie ma
>
> gwarancji, ze Ci ktos pomoze, ale jest takowa szansa.
>
>
>
> --
>
> pozdro
>
> R.e.m.e.K

Nie chciałem grupy zaśmiecać bo znalazłem podobny wątek, który założył jh. Problem mój polega na tym, że dostęp do WebSerwisu mam autoryzowany (username i pass). W SoapUI przy zapytaniu podaję nazwę użytkownika, hasło, ustawiam Authentication Type: Global HTTP Settings, WSS-Password Type: PasswordText i wysyłam zapytanie i otrzymuję wynik. W delphi na formę daję THTTPRIO nazwa użytkownika i hasło podaję takie jak w SoapUI i otrzymuję:
"<faultstring>Service &apos;XXService&apos; has been configured for security but no AuthenticationRequest could be located in the Message Context. Cannot authenticate without an AuthenticationRequest.</faultstring>". Próbowałem opisu z tej strony http://shenoyatwork.blogspot.com/2004/10/back-after-break.html z mizernym efektem. Nie za bardzo wiem za co się zabrać bo z WS zaczynam przygodę i wszystkiego się czepiam.

PZD
Seba

R.e.m.e.K

unread,
Sep 10, 2013, 7:58:29 AM9/10/13
to
Dnia Tue, 10 Sep 2013 04:18:57 -0700 (PDT), sebastia...@gmail.com
napisał(a):

> Nie chciałem grupy zaśmiecać bo znalazłem podobny wątek,

Pisanie na grupe Delphi o problemie zwiazanym z Delphi nie jest
zasmiecaniem. Etatowym smieciarzem jest tu niejaka Woleta Kiszel.


> W delphi na formę daję THTTPRIO nazwa użytkownika i hasło podaję takie jak w SoapUI

A gdzie konkretnie "podajesz" ten login i haslo?

Bo na moje oko powinienes wywolac metode SOAPowa od logowania po prostu, z
loginem i haslem.

--
pozdro
R.e.m.e.K

sebastia...@gmail.com

unread,
Sep 10, 2013, 9:08:27 AM9/10/13
to
> > W delphi na formę daję THTTPRIO nazwa użytkownika i hasło podaję takie jak w SoapUI
>
>
>
> A gdzie konkretnie "podajesz" ten login i haslo?
>
>
>
> Bo na moje oko powinienes wywolac metode SOAPowa od logowania po prostu, z
>
> loginem i haslem.
>
>
>
> --
>
> pozdro
>
> R.e.m.e.K
Hasło podałem (z palca) we właściwości HTTPRIO, czyli HTTPRIO>HTTPWebNode>Password i adekwatnie UserName. Próbowałem jawnie podać je w WSDLu czyli:
...
try
Result := (RIO as StanServicePortType);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
RIO.HTTPWebNode.UserName := 'USER';
RIO.HTTPWebNode.Password := 'PASS';
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
i występuje ten sam problem. Mam prośbę czy mógłbyś podać jakiekolwiek namiary jak wywołać te parametry przez SOAPa?
Z góry dziękuję

PZD
Seba

jh

unread,
Sep 10, 2013, 9:29:17 AM9/10/13
to
W dniu 10.09.2013 15:08, sebastia...@gmail.com pisze:
> Hasło podałem (z palca) we właściwości HTTPRIO, czyli HTTPRIO>HTTPWebNode>Password i adekwatnie UserName. Próbowałem jawnie podać je w WSDLu czyli:
> ...
> try
> Result := (RIO as StanServicePortType);
> if UseWSDL then
> begin
> RIO.WSDLLocation := Addr;
> RIO.Service := defSvc;
> RIO.Port := defPrt;
> RIO.HTTPWebNode.UserName := 'USER';
> RIO.HTTPWebNode.Password := 'PASS';
> end else
> RIO.URL := Addr;
> finally
> if (Result = nil) and (HTTPRIO = nil) then
> RIO.Free;
> end;
> i występuje ten sam problem. Mam prośbę czy mógłbyś podać jakiekolwiek namiary jak wywołać te parametry przez SOAPa?
> Z góry dziękuję

Robiłem dokładnie to co Ty ;) Okazało się, że tu nie ma logowania, a
jest jako metoda w którymś tam interfejsie zaczytanym z WSDLa.

jh

sebastia...@gmail.com

unread,
Sep 10, 2013, 10:51:08 AM9/10/13
to

> Robiłem dokładnie to co Ty ;) Okazało się, że tu nie ma logowania, a
>
> jest jako metoda w którymś tam interfejsie zaczytanym z WSDLa.
>
>
>
> jh

Eeee to nie jestem osamotniony w bojach ;). Przejrzałem WSDLa i mam tylko jeden interfejs i kilka Typów i nie widzę, żeby było logowanie na tym poziomie. Ale wielkie dzięki za naprowadzenie to zawsze krok do przodu.

PZD
Seba

R.e.m.e.K

unread,
Sep 10, 2013, 12:24:20 PM9/10/13
to
Dnia Tue, 10 Sep 2013 06:08:27 -0700 (PDT), sebastia...@gmail.com
napisał(a):
> Hasło podałem (z palca) we właściwości HTTPRIO, czyli HTTPRIO>HTTPWebNode>Password i adekwatnie UserName.
> Próbowałem jawnie podać je w WSDLu czyli:

Jawnie podac w WSDLu? Co Ty bredzisz?

> ...
> try
> Result := (RIO as StanServicePortType);
> if UseWSDL then
> begin
> RIO.WSDLLocation := Addr;
> RIO.Service := defSvc;
> RIO.Port := defPrt;
> RIO.HTTPWebNode.UserName := 'USER';
> RIO.HTTPWebNode.Password := 'PASS';
> end else
> RIO.URL := Addr;
> finally
> if (Result = nil) and (HTTPRIO = nil) then
> RIO.Free;
> end;
> i występuje ten sam problem. Mam prośbę czy mógłbyś podać jakiekolwiek namiary jak wywołać te parametry przez SOAPa?

Przeciez zrobiles TO SAMO co wpisanie w property na formie. Pierwszy raz
Delphi widzisz na oczy?

Interfejs StanServicePortType powinien miec metode od logowania. Jak sie ona
nazywa powie Ci albo wrozka abo dokumentacja, nikt z nas nie wie co to za
WebAPI. Zatem poczytac manual od uslugi lub przejrzyj wszystkie metody
StanServicePortType i zgadnij, ktora moze bc logowaniem.

--
pozdro
R.e.m.e.K

sebastia...@gmail.com

unread,
Sep 10, 2013, 2:30:46 PM9/10/13
to
> Przeciez zrobiles TO SAMO co wpisanie w property na formie. Pierwszy raz
>
> Delphi widzisz na oczy?
>

Z plaszczaka zawaliłeś... ale to mobilizuje ;).

PZD
Seba

R.e.m.e.K

unread,
Sep 10, 2013, 2:44:45 PM9/10/13
to
Dnia Tue, 10 Sep 2013 11:30:46 -0700 (PDT), sebastia...@gmail.com
napisał(a):

>> Przeciez zrobiles TO SAMO co wpisanie w property na formie. Pierwszy raz
>> Delphi widzisz na oczy?
>
> Z plaszczaka zawaliłeś... ale to mobilizuje ;).

Sie tak nad soba nie rozczulaj, bo to dopiero preludium.
Ale faktem jest, ze tak lepiej i glebiej dociera ;-)

--
pozdro
R.e.m.e.K
Message has been deleted

Romek

unread,
Sep 11, 2013, 10:43:00 AM9/11/13
to
Spróbuj tak :

procedure TForm2.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer);
var
s: string;
begin
s := 'Authorization: Basic ' + EncdDecd.EncodeString('login' + ':' + 'haslo');
if not HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_ADD) then
Application.MessageBox('HttpAddRequestHeaders', PChar(SysErrorMessage(GetLastError())), MB_OK);
end;

na serwerze IIS musisz mieć włączone uwierzytelnianie podstawowe.

Romek

sebastia...@gmail.com

unread,
Sep 11, 2013, 1:07:03 PM9/11/13
to
Ode mnie wychodzi takie zapytanie:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><SprawdzenieStanuRoot xmlns="http://www.portal.pl/ws"><KopertaWejsciowa xsi:nil="true"/></SprawdzenieStanuRoot></SOAP-ENV:Body></SOAP-ENV:Envelope>

a otrzymałem przykładowe i ma być takie:
<?xml version="1.0" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<NS1:Security xmlns:NS1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<Timestamp xsi:nil="true" />
<NS1:UsernameToken NS1:Id="">
<Username xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">USER</Username>
<NS1:Password Type="">PASS</NS1:Password>
<Nonce xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" />
<Created xsi:nil="true" />
</NS1:UsernameToken>
</NS1:Security>
</SOAP-ENV:Header>
.....dalej SOAP Body takie samo. Nie mam sekcji Header pomimo, że w HTTPRIO jest user i pass. Czy sekcję tą dodawac poprzez HTTPRIO1.SOAPHeaders.Send()? W dobrym kierunku kombinuję?
Próbowałem też wcześniej to co Romek napisał i nie autoryzuje. Serwer to Apache. W dokumentacji jest napisane, że webserwis wymaga przekazania loginu i hasła wg. standardowych metod SOAP.

PZD
Seba

R.e.m.e.K

unread,
Sep 11, 2013, 1:57:04 PM9/11/13
to
Dnia Wed, 11 Sep 2013 10:07:03 -0700 (PDT), sebastia...@gmail.com
napisał(a):

> Ode mnie wychodzi takie zapytanie:
> .....dalej SOAP Body takie samo. Nie mam sekcji Header pomimo, że w HTTPRIO jest user i pass. Czy sekcję tą dodawac poprzez HTTPRIO1.SOAPHeaders.Send()? W dobrym kierunku kombinuję?
> Próbowałem też wcześniej to co Romek napisał i nie autoryzuje. Serwer to Apache. W dokumentacji jest napisane, że webserwis wymaga przekazania loginu i hasła wg. standardowych metod SOAP.

Ty naprawde, jak mawial Adas Mialczynski, masz za daleko do lba?
Odczep sie od tego serwera http i opcji HTTPRIO i SPROBUJ zalogowac sie
przez WebAPI! Przez metode WebAPI!
Poszukaj metody Login() ktora zwraca zazwyczaj identyfikator sesji.
Metody szukaj w interfejsie StanServicePortType lub innym jesli jest ich
wiecej. Napisz w Delphi:

StanServicePortType<tu wstaw kropke>

i zobacz co Delphi podpowie. W tym co podpowie szukaj nazwy sugerujacej
mozliwosc logowania np. Login, CreateSession, GetSession, Authenticate lub
inne podobne.
To za trudne? Jesli tak to zlec to komus lepszemu :-)

--
pozdro
R.e.m.e.K

sebastia...@gmail.com

unread,
Sep 11, 2013, 2:50:26 PM9/11/13
to

> StanServicePortType<tu wstaw kropke>
>
RemeK z webserwisami tak jak wspomniałem zaczynam dopiero ale to jeszcze potrafię zrobić.
>
> i zobacz co Delphi podpowie. W tym co podpowie szukaj nazwy sugerujacej
>
> mozliwosc logowania np. Login, CreateSession, GetSession, Authenticate lub
>
> inne podobne.
W wygeneraowanym pliku przez WSDL Importera NIE MA dosłownie nic co tyczyłoby się logowania do WS... i dlatego czepiam się wszystkiego. Nie chciałbym publicznie podawać zawartości tego pliku bo mogę dostać zjeb.......
ale i tak dzięki za zainteresowanie bo już się odczepiam tego HTTPRIO

PZD
Seba

R.e.m.e.K

unread,
Sep 11, 2013, 3:10:05 PM9/11/13
to
Dnia Wed, 11 Sep 2013 11:50:26 -0700 (PDT), sebastia...@gmail.com
napisał(a):

> W wygeneraowanym pliku przez WSDL Importera NIE MA dosłownie nic

A np. GetToken()? :-)

>co tyczyłoby się logowania do WS... i dlatego czepiam się wszystkiego. Nie chciałbym publicznie podawać zawartości tego pliku bo mogę dostać zjeb.......
> ale i tak dzięki za zainteresowanie bo już się odczepiam tego HTTPRIO

Zobacz jeszcze to:

http://www.delphigroups.info/2/2/344173.html
http://stackoverflow.com/questions/13751289/send-simple-strings-in-soap-header-in-delphi
http://docwiki.embarcadero.com/RADStudio/XE4/en/Defining_and_Using_SOAP_Headers

--
pozdro
R.e.m.e.K

sebastia...@gmail.com

unread,
Sep 11, 2013, 3:47:47 PM9/11/13
to
Dzięki wielkie za linki. Czuję, że będę musiał dać sobie na jeden dzień spokój z tym projektem bo mam nieźle nawalone we łbie :). Jak zwykle okaże się ze to pierdółka... (a ile dni straconych).

PZD
Seba

ikarek

unread,
Sep 11, 2013, 3:51:34 PM9/11/13
to
Użytkownik <sebastia...@gmail.com> napisał w wiadomości
news:5af0fe80-ade3-4261...@googlegroups.com...

> W wygeneraowanym pliku przez WSDL Importera NIE MA dosłownie
> nic co tyczyłoby się logowania do WS... i dlatego czepiam się wszystkiego.

Może też być tak, że usługa autoryzacji jest pod innym adresem
niż usługa "właściwa" (patrz np. eWUŚ). Albo dodaj tę usługę
w Visual Studio i zobacz, co się urodzi :) mi osobiście było tam
dużo łatwiej opanować wsdl, aniżeli w Delphi.

sebastia...@gmail.com

unread,
Oct 4, 2013, 5:30:16 AM10/4/13
to
Po dluzszej przerwie w projekcie w koncu dalo rade zalogowac sie na WS. Poniewaz nie mialem sekcji Header w moim zapytaniu (a tam byl login i haslo) musialem pozmieniac troche plik pas utworzony przez WSDLImportera i dodac pare rzeczy z tej str: https://forums.embarcadero.com/message.jspa?messageID=463953. Pomocne byly jeszcze informacje z tych linkow:
http://stackoverflow.com/questions/13751289/send-simple-strings-in-soap-header-in-delphi
https://forums.embarcadero.com/message.jspa?messageID=290629#290629
i oczywiscie linki, ktore podal Remek.
Pisze bo moze sie kiedys komus to przyda.
Jeszcze raz dzieki chlopaki za pomoc!!

PZD
Seba
0 new messages