Autor Téma: Komunikace s novou verzi ARES  (Přečteno 1226 krát)

Offline fojtik

  • Nováček
  • *
  • Příspěvků: 15
  • Karma: 0
    • Verze Delphi: Delphi XE2
Komunikace s novou verzi ARES
« kdy: 07-11-2023, 14:36:20 »
Ahoj,
zkousim se dostat k datum na novem rozhrani sluzby ARES. V Delphi 11 mam tento jednoduchy testovaci priklad:

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, idHttp, IdSSLOpenSSL;

procedure TForm1.Button1Click(Sender: TObject);
var http:TIdHTTP;
var stream:TStream;
    AURL: String;
begin
  AURL := 'https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/16669711';
  http := TIdHTTP.Create(nil);
  stream := TMemoryStream.Create();
  try
    http.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(http);
    http.HandleRedirects := True;
    http.Get(AURL, stream);
  finally
    http.Free;
  end;
end;


Pokus o komunikaci pada na chybovou hlasku

Socket Error # 10054
Connection reset by peer.

Netusite kde hledat zakopaneho psa?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3442
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Komunikace s novou verzi ARES
« Odpověď #1 kdy: 07-11-2023, 14:47:50 »
Great
Rated 2 times
nechce zkusit integrovaneho http klienta, bez zavislosti na externich dll? https://delphi.cz/post/Par-utrzku-k-XE8.aspx
Embarcadero MVP - Czech republic

Offline fojtik

  • Nováček
  • *
  • Příspěvků: 15
  • Karma: 0
    • Verze Delphi: Delphi XE2
Re:Komunikace s novou verzi ARES
« Odpověď #2 kdy: 07-11-2023, 15:27:38 »
Muzu potvrdit ze knihovny System.Net.httpclient,System.Net.URLClient a trida IHTTPResponse jsou resenim v Delphi 11.

Asi bych rozvinul muj puvodni problem. Mam aplikaci v Delphi XE7. Nakonec jsem se rozhodl ze pro HTML get a post si udelam dll knihovnu v Delphi 11. Protoze vyse zmineny kod mi nefunguje ani v delphi XE7 ani v delphi 11.

V kazdem pripade dekuji za odezvu a pripadne bych zvolil cestu dll knihovny. Ale existuje reseni i v delphi XE7, ktere jeste nezna knihovnu System.Net.httpclient?


Offline fojtik

  • Nováček
  • *
  • Příspěvků: 15
  • Karma: 0
    • Verze Delphi: Delphi XE2
Re:Komunikace s novou verzi ARES
« Odpověď #3 kdy: 07-11-2023, 15:47:07 »
A jeste jedna poznamka. Kdyz zmenim

AURL := 'https://www.google.com/'; //'https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/16669711';

tak prikaz funguje. Takze sluzba

https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/

se chova jinak nez

https://www.google.com/

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3442
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Komunikace s novou verzi ARES
« Odpověď #4 kdy: 07-11-2023, 18:54:58 »
Excellent
Rated 1 time
Nejsem expert na Indy, ale asi bude vyzadovat vyssi zabezpeceni, tj. budes muset nastavit



var
   LIOHandleSSL: TIdSSLIOHandlerSocketOpenSSL;



  LIOHandleSSL := TIdSSLIOHandlerSocketOpenSSL.Create(Server);

  LIOHandleSSL.SSLOptions.Mode := sslmUnassigned;
  LIOHandleSSL.SSLOptions.Method := sslvTLSv1_2;
  LIOHandleSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];

  LIOHandleSSL.SSLOptions.VerifyMode := [];
  LIOHandleSSL.SSLOptions.VerifyDepth := 0;

http.IOHandler := LIOHandleSSL;



nebo varianta 2), pouzit SChannel s Indy https://delphi.cz/post/SChannel-TLS-pro-Indy.aspx, to mi funguje slusne a bez DLL

Embarcadero MVP - Czech republic

Offline Marek Weyda

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 8
    • Verze Delphi: Delphi 2007, 10.1 Berlin
Re:Komunikace s novou verzi ARES
« Odpověď #5 kdy: 07-11-2023, 21:48:39 »
Excellent
Rated 1 time
Podle mě to souvisí s tím, co jsme intenzivně řešili od doby COVID - všechno možné jsme museli předělávat na vyšší verzi SSL/TLS.

Na to jednak ukazuje to, že se určité adresy chovají OK, zatímco jiné to spojení zaříznou. A pak také ta hláška, která znamená, že to zkrátka druhá strana zařízla a to s největší pravděpodobností právě kvůli tomu, že používáte slabou verzi SSL/TLS.

Já s ARES žádný problém neměl, vyjma toho, že ta první verze obsahovala některé nepříjemnosti, to jsme tady nedávno řešili. Ale spojení bylo OK, ale je pravda, že já po zkušenostech z doby COVID už využívám při spojení co největší zabezpečení, takže druhá strana nemá důvod mě odříznout.

Jinak osobně doporučuji Indy nepoužívat, kde mohu, tak jsem je už z projektů odstranil. Nové věci dělám zásadně jenom přes WinInet. Už žádné komponenty třetích stran, zažívání těch šíleností s verzemi Indy a Open SSL knihoven.

Offline fojtik

  • Nováček
  • *
  • Příspěvků: 15
  • Karma: 0
    • Verze Delphi: Delphi XE2
Re:Komunikace s novou verzi ARES
« Odpověď #6 kdy: 08-11-2023, 13:18:33 »
Dekuji za tipy, vyssi zapezpeceni pomohlo.

Offline Jan Šebelík

  • Nováček
  • *
  • Příspěvků: 17
  • Karma: 0
    • Verze Delphi: Delphi 7, Firebird, MS SQL
Re:Komunikace s novou verzi ARES
« Odpověď #7 kdy: 05-01-2024, 07:25:07 »
Socket Error # 10054
Connection reset by peer.

Ano, použít vyšší zabezpečení funguje.
Mám Delphi 7, tedy nemohu použít techniky, které přišly s novějšími verzemi Delphi.NET. Používám Indy 10.
Schematicky:

const
  darv_bas_url = 'https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty-res/%s';
begin
  http:=TIdHTTP.Create(nil);
  SSLHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(http);
  try
    SSLHandler.SSLOptions.Method := sslvTLSv1_2;
    http.IOHandler := SSLHandler;
    url:=format(darv_bas_url,[ico]);
    response:=http.Get(url);
  finally
    http.Free;
  end;
end;

Výsledek dostanu, ale je špatně kódovaný.
{"icoId":"61481297","zaznamy":[{"ico":"61481297","obchodniJmeno":"RNDr. Jan ??ebel??k","sidlo":{"kodStatu":"CZ","nazevStatu":"??esk?? republika","kodKraje":86,"nazevKraje":"Kr??lov??hradeck?? kraj","kodOkresu":3604,"nazevOkresu":"Ji????n","kodObce":573094,"nazevObce":"L??zn?? B??lohrad","kodUlice":165891,"nazevUlice":"Vojt????kova","cisloDomovni":321,"kodCastiObce":79332,"nazevCastiObce":"L??zn?? B??lohrad","kodAdresnihoMista":1766210,"psc":50781,"textovaAdresa":"Vojt????kova 321, 50781 L??zn?? B??lohrad"},"pravniForma":"101","financniUrad":"238","datumVzniku":"1995-02-07","datumAktualizace":"2023-02-16","pravniFormaRos":"100","czNace":["55","620","7490","G"],"statistickeUdaje":{"institucionalniSektor2010":"14200","kategoriePoctuPracovniku":"110"},"zakladniUzemniJednotka":"573094","primarniZaznam":true}]}

Tedy zkouším
  response:=http.Get(url,IndyTextEncoding(encUTF8));
Vyzkoušel jsem všechny možnosti
  IdTextEncodingType = (encIndyDefault, encOSDefault, enc8Bit, encASCII, encUTF16BE, encUTF16LE, encUTF7, encUTF8);

Ale furt špatně.
Tak asi nějak jinak?


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3442
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Komunikace s novou verzi ARES
« Odpověď #8 kdy: 05-01-2024, 09:40:34 »
Ano, použít vyšší zabezpečení funguje.
Mám Delphi 7, tedy nemohu použít techniky, které přišly s novějšími verzemi Delphi.NET. Používám Indy 10.

Výsledek server vraci v UTF-8, spatne to prekodovavate. Stahnete si to jako stream a ten prokodujte jako UTF-8, to bude pro vas nejjednodussi.
Jinak Indy10 by to mela normalne podporovat, ale zarekl jsem se, ze se D7 nebudu obsirneji venovat, protoze podpora D7 z roku 2002 zabiji vyvoj Delphi.

Delphi.NET jsou jen dve paralelni verze a zanikly. Uz cca pres 15 let jsou Delphi normalne Win32/64 a dalsi platformy.



 
Embarcadero MVP - Czech republic

Offline Jan Šebelík

  • Nováček
  • *
  • Příspěvků: 17
  • Karma: 0
    • Verze Delphi: Delphi 7, Firebird, MS SQL
Re:Komunikace s novou verzi ARES
« Odpověď #9 kdy: 05-01-2024, 10:42:22 »
Great
Rated 1 time
Citace
Výsledek server vraci v UTF-8, spatne to prekodovavate. Stahnete si to jako stream a ten prokodujte jako UTF-8, to bude pro vas nejjednodussi.
Jinak Indy10 by to mela normalne podporovat, ale zarekl jsem se, ze se D7 nebudu obsirneji venovat, protoze podpora D7 z roku 2002 zabiji vyvoj Delphi.
Jj, díky za info, už jsem to našel.

http.Get do streamu (nikoli stringu) a pak LoadFromStream a Utf8ToAnsi. Funguje.
A unit uLkJSON.pas už jsem taky našel.
Tedy jsem v podstatě hotov.

Svoje Delphi 7 tady nechci obhajovat, ale projekt který mě živí, je starý 16 let (2007) a já (69) už ho přepisovat nebudu. Něco jsme řešili v C# (třeba EET, COM object), jinak to stále nějak zvládáme.
« Poslední změna: 05-01-2024, 10:55:35 od Jan Šebelík »