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

GUS i httprio - SID w nagłówku http

651 views
Skip to first unread message

kali - Tomasz Kalinowski

unread,
Oct 26, 2017, 9:00:56 AM10/26/17
to
Cześć,
Panowie, proszę o podpowiedź.
GUS/webserwis/DaneSzukaj. Właściwie mam prawie wszystko, ale...

mam tak: HTTPRIO, zaimportowany wsdl. OK. (ala token). Tworzę kopertę SOAP, dodaję header soapowy, pobieram sid ... Problem:
muszę dodać pobrany sid do zwykłego nagłówka http.
Czy da się to zrobić na httprio (np. webnodebeforepost?( Jeśli tak, to jak?). Czy trzeba to parsować jakoś inaczej? Z dodaniem nagłówka w SOAP poradziłem, a tu męczę i męczę ... Jak to ugryźć?

kali - Tomasz Kalinowski

unread,
Oct 28, 2017, 6:11:17 AM10/28/17
to
Witam ponownie.
Postaram się trochę wyjaśnić mój problem. Chodzi o pobieranie danych o podmiotach z platformy GUSu: usługa BIR1 (https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd)

Na chwilę obecną działam na platformie testowej. Pierwszy etap przechodzę bez problemu. Czyli "loguje się" - pobieram identyfikator sesji SID. Ale owy SID należy przekazywać jako dodatkowy nagłówek żądania http o nazwie SID w kolejnych wywołaniach (dokumentacja), co jest moim głównym problemem.

Tak więc tworzę w delphi nową kopertę soap do wyszukiwania danych:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
<wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukaj</wsa:Action>
</SOAP-ENV:Header><SOAP-ENV:Body><DaneSzukaj xmlns="http://CIS/BIR/PUBL/2014/07"><pParametryWyszukiwania><Nip xmlns="http://CIS/BIR/PUBL/2014/07/DataContract">5420201038</Nip></pParametryWyszukiwania></DaneSzukaj></SOAP-ENV:Body></SOAP-ENV:Envelope>


Pozostaje dodanie przed wysłaniem dodatkowego nagłówka SID, a więc coś w stylu:

...
Content-Type: text/xml;charset=UTF-8
sid: otrzymanykluczsesji
... a potem koperta
<SOAP-ENV:Envelope xmlns:SOAP-ENV.....>
....
</SOAP-ENV:Envelope>


Koperta jest ok. Gdy korzystam z SoapUI, wystarczy że wkleję ja i skorzystam z funkcji SoapUI: Header/Adds a custom HTTP header to this message i podam tam pobrany SID i dostaję właściwą odpowiedź.

W jaki sposób mogę dodać w delphi ten nagłówek?
ps: muszę używać thttprio (import wsdl'a tworzy metody wymagające właśnie rio).

Jeśli do edycji nagłówka http ma użyć innego komponentu np. z Indy, to jak potem złożyć to w całość: idhttp+httprio ?

Z góry dziękuję za podpowiedź i przepraszam za namolność. Webservicy obczajam od niedawna, więc być może zastanawiam się nad zupełną podstawą? Choć chyba nie, bo znalazłem trochę pytań podobnego typu, jednak bez odpowiedzi. Więcej jest info o nagłówkach soapowych, a tu nie o to chodzi.



pozdrawiam,
- kali

FrontMan

unread,
Oct 30, 2017, 4:07:51 AM10/30/17
to
procedure TGUSHelper.BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
lId: String;
begin
lId := 'sid:' + fSessionId;
HttpAddRequestHeaders(Data, PChar(lId), Length(lId), HTTP_ADDREQ_FLAG_ADD);
end;

kali - Tomasz Kalinowski

unread,
Oct 30, 2017, 8:21:07 AM10/30/17
to
FrontMan - Bardzo Dziękuję.

Idę tym tropem do soboty. Utwierdzasz mnie, że właściwym. Ale mam zwracany błąd: EDOMParsError with message 'Nieprawidłowa wartość na najwyższym poziomie dokumentu' - tak jakby rozsypywała się koperta. Ale gdy zapisuje kopertę z RIOBeforeExecute, to w SoapUI działa bezbłędnie (po dodaniu nagłówka HTTP w SoapUI). Może za późno następuje modyfikacja nagłówka?
Chyba muszę przechwycić co właściwie wychodzi do sieci jakimś WireSharkiem lub czymś takim. Nigdy wcześniej tego nie próbowałem...

Jeszcze raz dziękuję bardzo za podpowiedź. Gdyby były jeszcze jakieś, chętnie wysłucham...
Dobrego tygodnia!
- kali


Roman Tyczka

unread,
Oct 30, 2017, 8:51:45 AM10/30/17
to
On Mon, 30 Oct 2017 05:21:06 -0700 (PDT), kali - Tomasz Kalinowski wrote:

> Chyba muszę przechwycić co właściwie wychodzi do sieci jakimś WireSharkiem lub czymś takim. Nigdy wcześniej tego nie próbowałem...

Tym się takie rzeczy robi:

https://www.telerik.com/download/fiddler


--
pozdrawiam
Roman Tyczka

kali - Tomasz Kalinowski

unread,
Oct 30, 2017, 9:22:15 AM10/30/17
to
Super, Dzięki!

kali - Tomasz Kalinowski

unread,
Oct 31, 2017, 3:14:32 AM10/31/17
to
podpowiedź FrontMan:
jest ok. Nagłówek jest dodawany prawidłowo.


Podbieram dane z webservisu i to one wywołują wyjątek, o którym wspominałem:
EDOMParsError with message 'Nieprawidłowa wartość na najwyższym poziomie dokumentu'
Myślę, że problem bierze się z kodowania, bo zwrócone dane są pokrzaczkowane, ale prawidłowe (co merytoryki).

Dobrego dnia!

kali - Tomasz Kalinowski

unread,
Nov 2, 2017, 6:44:44 AM11/2/17
to
Poproszę Was jeszcze jednak o pomoc. Utkwiłem dalej. Aktualnie dane odbieram ale pojawia się wspomniany błąd (po pobraniu danych): EDOMParsError with message 'Nieprawidłowa wartość na najwyższym poziomie dokumentu'

Co i jak:
Wysyłana koperta SOAP:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To> <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukaj</wsa:Action> </SOAP-ENV:Header><SOAP-ENV:Body><DaneSzukaj xmlns="http://CIS/BIR/PUBL/2014/07"><pParametryWyszukiwania><Nip xmlns="http://CIS/BIR/PUBL/2014/07/DataContract">5420201038</Nip></pParametryWyszukiwania></DaneSzukaj></SOAP-ENV:Body></SOAP-ENV:Envelope>

Odpowiedź. Dane odbieram w postaci (&lt; &gt; ...):

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajResponse</a:Action></s:Header><s:Body><DaneSzukajResponse xmlns="http://CIS/BIR/PUBL/2014/07"><DaneSzukajResult>&lt;root&gt;&#xD;
&lt;dane&gt;&#xD;
&lt;Regon&gt;05002589200000&lt;/Regon&gt;&#xD;
&lt;RegonLink&gt;&amp;lt;a href='javascript:danePobierzPelnyRaport("05002589200000","DaneRaportPrawnaPubl", 0);'&amp;gt;050025892&amp;lt;/a&amp;gt;&lt;/RegonLink&gt;&#xD;
&lt;Nazwa&gt;MPO SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ&lt;/Nazwa&gt;&#xD;
&lt;Wojewodztwo&gt;PODLASKIE&lt;/Wojewodztwo&gt;&#xD;
&lt;Powiat&gt;m. Białystok&lt;/Powiat&gt;&#xD;
&lt;Gmina&gt;M. Białystok&lt;/Gmina&gt;&#xD;
&lt;Miejscowosc&gt;Białystok&lt;/Miejscowosc&gt;&#xD;
&lt;KodPocztowy&gt;15-950&lt;/KodPocztowy&gt;&#xD;
&lt;Ulica&gt;ul. Test-Krucza&lt;/Ulica&gt;&#xD;
&lt;Typ&gt;P&lt;/Typ&gt;&#xD;
&lt;SilosID&gt;6&lt;/SilosID&gt;&#xD;
&lt;/dane&gt;&#xD;
&lt;/root&gt;</DaneSzukajResult></DaneSzukajResponse></s:Body></s:Envelope>


I otrzymuje błąd j.w. Więc podmieniam Response w HTTPRIO1AfterExecute:

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
SOAPResponse: TStream);
var sl: tstringlist;
data:string;
begin
if operacja='DaneSzukaj' then
begin
//showmessage('tu');
Memo1.Lines.Add(' ______________________________________');
Memo1.Lines.Add('Resopnse: '+MethodName);
sl:=TStringList.Create;

SOAPResponse.Position:=0;
with TStringStream.Create('') do
try
CopyFrom(SOAPResponse, SOAPResponse.Size - SOAPResponse.Position);
data:= DataString;
Data:=StringReplace(Data,'&amp;','&',[RfReplaceAll]);
Data:=StringReplace(Data,'&lt;','<',[RfReplaceAll]);
Data:=StringReplace(Data,'&gt;','>',[RfReplaceAll]);
Data:=StringReplace(Data,'&#xD;','',[RfReplaceAll]);
// Data:=StringReplace(Data,'<DaneSzukajResult>','<DaneSzukajResult><![CDATA[',[RfReplaceAll]);
// Data:=StringReplace(Data,'</root>','</root>]]>',[RfReplaceAll]);

sl.Add(data);

SOAPResponse.Size := 0;
SOAPResponse.Position := 0;
sl.SaveToStream(SOAPResponse);
Data:=UTF8ToWideString(Data);
Memo1.Lines.Add(data);
finally
Free;
end;
end;


Oczywiście wtedy odpowiedź jest czytelniejsza (+UTF8ToWideString):

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajResponse</a:Action></s:Header><s:Body><DaneSzukajResponse xmlns="http://CIS/BIR/PUBL/2014/07"><DaneSzukajResult><root>
<dane>
<Regon>05002589200000</Regon>
<RegonLink><a href='javascript:danePobierzPelnyRaport("05002589200000","DaneRaportPrawnaPubl", 0);'>050025892</a></RegonLink>
<Nazwa>MPO SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ</Nazwa>
<Wojewodztwo>PODLASKIE</Wojewodztwo>
<Powiat>m. Białystok</Powiat>
<Gmina>M. Białystok</Gmina>
<Miejscowosc>Białystok</Miejscowosc>
<KodPocztowy>15-950</KodPocztowy>
<Ulica>ul. Test-Krucza</Ulica>
<Typ>P</Typ>
<SilosID>6</SilosID>
</dane>
</root></DaneSzukajResult></DaneSzukajResponse></s:Body></s:Envelope>

jednak błąd nadal się pojawia. Dodawałem więc znaczniki CDATA: Mimo to, ciągle to samo:
EDOMParsError:
Line: 215 </root>]]></DaneSzukajResult></DaneSzuka'. (tak, brak j>)
Debuger zatrzymuje program w Xml.XMLDoc w procedurze LoadData w tym miejscu:

if not Status then
begin
DocSource := xdsNone;
ParseError := DOMDocument as IDOMParseError;
Msg := Format('%s%s%s: %d%s%s', [ParseError.Reason, SLineBreak, SLine,
ParseError.Line, SLineBreak, Copy(ParseError.SrcText, 1, 40)]);
> raise EDOMParseError.Create(ParseError, Msg);
end;


Przeglądałem Unofficial SOAP Bug Fixes, ale prócz poprawki ActivateDSL z SOAP.WSDLNode.pas niczego nie znalazłem.
Odpowiedź z danymi z ws, po dokonaniu zamian w responsie (&lt;...) wygląda identycznie, jak ta, którą otrzymuję w SoapUI.

Pracuje na wersjii Berlin.

Może macie dla mnie jakieś sugestie?
Czy owy problem ze znacznikami cdata/&lt; da się rozwiązać zgrabniej?
Jest też problem z kodowaniem. Dane które wracają się krzaczą dopóki nie wykonam konwersji UTF8ToWideString (może to jakaś wskazówka).

Dzięki za pomoc ....
- kali

J-23

unread,
Nov 2, 2017, 11:42:53 AM11/2/17
to
W dniu 02.11.2017 o 11:44, kali - Tomasz Kalinowski pisze:
Na moje oko to nie pobierasz pełnego XML

zamykasz </s:Body> ale nigdzie go nie pobierasz stąd debugger krzyczy ze
w linii 215 masz błąd

To co piszę to są tylko moje przypuszczenia na podstawie kodu który tu
zamiesciłeś - nie musi mieć to nic wspólnego z twoim problemem ale ja
bym zaczął od tego


> jednak błąd nadal się pojawia. Dodawałem więc znaczniki CDATA: Mimo to, ciągle to samo:
> EDOMParsError:
> Line: 215 </root>]]></DaneSzukajResult></DaneSzuka'. (tak, brak j>)
> Debuger zatrzymuje program w Xml.XMLDoc w procedurze LoadData w tym miejscu:
>

Pozdrawiam
J-23

zpksoft

unread,
Nov 3, 2017, 3:44:34 AM11/3/17
to
Nie używam tej technologii, ale patrząc na to co robisz narzuca mi się taka uwaga: node <DaneSzukajResult> azwiera tekst zawierający znaki '<' oraz '>' stąd żeby xml się nie rozleciał są one zamienione na &lt; oraz &gt;. Twoja konwersja powoduje że xml się nie trzyma kupy.
Możesz moim zdaniem dokonać takiej konwersji, ale pod warunkiem, że nie wstawiasz ponownie danych z node <DaneSzukajResult> do dokumentu bo to już nie jest ten sam dokument.
Oczywiście zastrzegam się, że nie znam SOAP więc może tam takie kwiatki są dopuszczalne.
Kolejna sprawa to ucieczka z UTF-8 do widestring: myślę, że to niepotrzebne. Krzaki możesz widzieć bo być może czytnik w którym to oglądasz nie wie co to UTF-8.

Paweł

Paweł

kali - Tomasz Kalinowski

unread,
Nov 8, 2017, 5:28:06 AM11/8/17
to
Dziękuje za sugestie. Problem pozostaje nierozwiązany.
J-23 - znacznik <body> jest otwierany i zamykany.
Paweł - analizowałem problem pod kątem Twojej odpowiedzi lecz po weryfikacji i kilku próbach, stwierdzam, że to nie to.
W końcu ostatecznie otrzymuję odpowiedź identyczną jak w SoapUI (po zamianach), zapisuję ją w streamie odpowiedzi, a mimo to kompilator się wykłada...

FrontMan

unread,
Nov 8, 2017, 10:33:51 AM11/8/17
to
Pomogę Ci tylko nie wiem jak się do tego zabierasz. Wygenerowales interfejsy na podstawie WSDL i ich używasz ?

kali - Tomasz Kalinowski

unread,
Nov 9, 2017, 1:32:40 AM11/9/17
to
FrontaMan - Dziękuję z góry.
Tak, na podstawie wsdl'a oraz instrukcji http://bip.stat.gov.pl/dzialalnosc-statystyki-publicznej/rejestr-regon/interfejsyapi/jak-skorzystac-informacja-dla-podmiotow-komercyjnych/ dokonałem importu wsdl'a i działam na powstałych funkcjach.

Zauważ, że udaje się komunikacja z webservicem. "Logowanie" oraz pobranie danych o które pytam przebiega pomyślnie. Co prawda dane przychodzą nieco
"pokrzaczone" kodowaniem, ale i to udaje się ostatecznie rozwiązać. Natomiast denerwujący jest generowany wyjątek po odebraniu danych. Można by go po prostu ładnie obsłużyć, ale przecież nie o to chodzi. Musi być jakaś przyczyna.... Mogę Ci nawet podesłać projekt. Może to problem wersji delphi? ...
- kali

FrontMan

unread,
Nov 9, 2017, 1:42:46 AM11/9/17
to
Podeslij proszę na yaromeer at gazeta dot pl.

kali - Tomasz Kalinowski

unread,
Nov 10, 2017, 5:18:06 PM11/10/17
to
Problem wydaje się być w wersji delphi (Berlin), ewentualnie po stronie PC. Kod skompilowany pod XE7 u FrontMana nie zwraca żadnych błędów.
Dziękuję wszystkim za zaangażowanie pomoc!
Dobrego weekendu!
- kali
0 new messages