Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi Rest API e-Visitor

[es] :: Pascal / Delphi / Kylix :: Delphi Rest API e-Visitor

Strane: 1 2

[ Pregleda: 4671 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Delphi Rest API e-Visitor06.11.2015. u 14:51 - pre 51 meseci
Da bi pristup API-ju bio dozvoljen potrebno se prijaviti (login) u sustav koristeći Authentication service API (URI: https://www.evisitor.hr/eVisit...spNetFormsAuth/Authentication/), koji implementira slijedeće metode:

Login
Interface: (string UserName, string Password, bool PersistCookie) -> bool
Primjer request data: {"UserName":"myusername","Password":"mypassword","PersistCookie":false}


Da li mogu to odraditi sa TIdHTTP? Kako se uopće šalje više request-a?

Hvala.
F
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Delphi Rest API e-Visitor07.11.2015. u 00:11 - pre 51 meseci
Evo jednog brzinskog primera, a ti ga već malo sredi, kako ti odgovara. Drugo pitanje nisam baš razumeo...? Request šalješ sa IdHTTP.Post(), IdHTTP.Get()... šta ti već treba. Jedan poziv metodi je jedan request (uglavnom, zavisi sad od podešavanja redirekcije, autorizacije, itd.).

p.s. sUrl ima pogrešnu vrednost, sajt skraćuje (trunc-uje) link, ispravi i ubaci pun link. A što se JSON-a tiče, novije verzije Delphi-ja imaju podršku za rad sa istim, pa to može biti i malo elegantnije, mada je za ovaj konkretan slučaj relativno nebitno.

Code:
uses
  IdHTTP,
  IdSSLOpenSSL;

var
  sUrl,
  sRequest,
  sResponse: string;
  ssRequest,
  ssResponse: TStringStream;
  IdHTTP: TIdHTTP;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  sUrl     := 'https://www.evisitor.hr/eVisit...spNetFormsAuth/Authentication/';
  sRequest := '{"UserName":"myusername","Password":"mypassword","PersistCookie":false}';
  //
  IdHTTP         := TIdHTTP.Create(nil);
  IdSSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create();
  ssRequest      := TStringStream.Create(sRequest);
  ssResponse     := TStringStream.Create('');
  try
    IdHTTP.IOHandler := IdSSLIOHandler;
    IdHTTP.Post(sUrl, ssRequest, ssResponse);
    //
    sResponse := ssResponse.DataString;
    ShowMessage(sResponse);
  finally
    ssResponse.Free();
    ssRequest.Free();
    IdSSLIOHandler.Free();
    IdHTTP.Free();
  end;
end;
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor07.11.2015. u 13:02 - pre 51 meseci
Hvala ti Bug! Isprobam pa se javim :)
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor13.11.2015. u 13:17 - pre 50 meseci
Dobijam Could not load SSl library. Pretpostavljam da ima veze sa verzijom .dll-a. Idem googlat, ako netko ima neku ideju, nemojte se sramiti reći :)
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor17.11.2015. u 10:40 - pre 50 meseci
Probao sam ovako, nakon šta sam pronašao odgovarajuće dll-ove:

Code (delphi):
var
  IdHTTP1: TIdHTTP;
  Src: string;
  LHandler: TIdSSLIOHandlerSocket;
  ssRequest: TStringStream;
  sRequest: string;
begin
  sRequest := '{"UserName":"1234","Password":"passw","PersistCookie":false}';
  ssRequest := TStringStream.Create(sRequest);
  try
    IdHTTP1 := TIdHTTP.Create(nil);
    try
      LHandler := TIdSSLIOHandlerSocket.Create(IdHTTP1);
    //LHandler.SSLOptions.Method := sslvTLSv1;
      try
        IdHTTP1.IOHandler := LHandler;
        Src := IdHTTP1.Post('https://www.evisitor.hr/eVisit...spNetFormsAuth/Authentication/', ssRequest);
      finally
        LHandler.Free;
      end;
    finally
      IdHTTP1.Free;
    end;
  except on E: Exception do
      showmessage(E.ClassName + ': ' + E.Message);
  end;


Tu sada dobijem grešku:

Error connecting with SSL.

Koliko sam pronašao, to je najvjerojatnije problem sa postavkama TIdSSLIOHandlerSocket-a, pa sam iskušavao razne metode:

Code (delphi):
LHandler.SSLOptions.Method := sslvTLSv1;
(probao i sa sslvSSLv23)

Tu pak dobijemAccessViolation na liniji .Post

Bilo kakva pomoć dobrodošla.
F
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Delphi Rest API e-Visitor17.11.2015. u 23:56 - pre 50 meseci
Jos se patis s tim :( Na prvu loptu:

Code:
LHandler: TIdSSLIOHandlerSocket;
Zasto ovde koristis TIdSSLIOHandlerSocket? U pitanju je bazna klasa, a njena konkretna (OpenSSL) implementacija koju valja koristiti je TIdSSLIOHandlerSocketOpenSSL - pogledaj opet primer koji sam postavio :)

Code:
LHandler := TIdSSLIOHandlerSocket.Create(IdHTTP1)
Zasto prinosis IdHTTP1 kao parametar za konstruktor? Ako planiras sam da kasnije unistis objekat (kao sto cinis), za tim nema potrebe, koristi konstruktor bez parametara:
Code:
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create();

Code:
LHandler.SSLOptions.Method := sslvTLSv1;
Ovo je default vrednost u novim verzijama Delphi-ja (Indy-ja), ako to kod tebe nije slucaj, onda slobodno setuj tako kako si napisao. Zavisi i od podesavanja servera, ali uglavnom danas je ovo najcesci slucaj.

Nisam ti nista pisao za DLL-ove jer mi Delphi ovog puta nista nije trazio, ali moguce da ih imam u nekom sistemskom folderu, ili gde vec, pa ih odatle ucitava i zato i ne trazi. Javi ima li napretka :)
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 08:08 - pre 50 meseci
Još se patim i sve mi se čini da budem još dugo :(

Citat:
((BugA)): Jos se patis s tim :( Na prvu loptu:

Code:
LHandler: TIdSSLIOHandlerSocket;
Zasto ovde koristis TIdSSLIOHandlerSocket? U pitanju je bazna klasa, a njena konkretna (OpenSSL) implementacija koju valja koristiti je TIdSSLIOHandlerSocketOpenSSL - pogledaj opet primer koji sam postavio :)


Ne kompajlira mi sa
Code (delphi):
TIdSSLIOHandlerSocketOpenSSL
a ovo sam pronašao na netu:

Citat:
In Delphi 6/7 the component was called TIdSSLIOHandlerSocket.


Citat:

Code:
LHandler := TIdSSLIOHandlerSocket.Create(IdHTTP1)
Zasto prinosis IdHTTP1 kao parametar za konstruktor? Ako planiras sam da kasnije unistis objekat (kao sto cinis), za tim nema potrebe, koristi konstruktor bez parametara:
Code:
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create();



TIdSSLIOHandlerSocket ne prihvaća bez parametra, po defaultu sam stavio self, iz očaja sam pokušavao i sa IdHTTP1 :)

Citat:

Code:
LHandler.SSLOptions.Method := sslvTLSv1;
Ovo je default vrednost u novim verzijama Delphi-ja (Indy-ja), ako to kod tebe nije slucaj, onda slobodno setuj tako kako si napisao. Zavisi i od podesavanja servera, ali uglavnom danas je ovo najcesci slucaj.

Nisam ti nista pisao za DLL-ove jer mi Delphi ovog puta nista nije trazio, ali moguce da ih imam u nekom sistemskom folderu, ili gde vec, pa ih odatle ucitava i zato i ne trazi. Javi ima li napretka :)


Imam neku stariju verziju Indy-a, a strah me instalirati noviju jer imam neke druge projekte u kojima koristim Indy pa me strah da ne u.ebem nešto drugo.
Sa Synapse libraryem i njezinom funkcijom
Code:
HttpPostURL
koja vraća true/false kao rezultat dobijem FALSE. Nisam još uspio otkriti da li je taj FALSE odgovor servera ili mi javlja FALSE jer nije niti uspio post-ati request. Pozabavit ću se još danas sa time i probati otkriti šta ga muči.

U svakom slučaju, puno ti hvala za sada.
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 08:42 - pre 50 meseci
Ovo je funkcija HttpPostURL

Code (delphi):
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    WriteStrToStream(HTTP.Document, URLData);
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    Result := HTTP.HTTPMethod('POST', URL);
    if Result then
      Data.CopyFrom(HTTP.Document, 0);
  finally
    HTTP.Free;
  end;
end;


koja mi daje Result := FALSE;

Da li je to odgovor servera ili taj FALSE znači da nije niti prošao POST?
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 10:16 - pre 50 meseci
Pronašao od Chillkata Active-X, probao sa njime ovako:

Code (delphi):
var
  req: TChilkatHttpRequest;
  http: TChilkatHttp;
  success: Integer;
  jsonText: PWideChar;
  resp: IChilkatHttpResponse;

begin
  req := TChilkatHttpRequest.Create(Self);
  http := TChilkatHttp.Create(Self);

//  Any string unlocks the component for the 1st 30 days.
  success := http.UnlockComponent('Anything for 30-day trial');
  if (success <> 1) then
  begin
    Memo1.Lines.Add(http.LastErrorText);
    Exit;
  end;

  http.AcceptCharset := '';
  http.UserAgent := '';
  http.AcceptLanguage := '';

  http.AllowGzip := 0;

//http.AddQuickHeader('Cookie','JSESSIONID=1234');

  jsonText := '{"UserName":"123","Password":"passw","PersistCookie":false}';

  resp := http.PostJson('https://www.evisitor.hr/eVisit...spNetFormsAuth/Authentication/', jsonText);
  if (resp = nil) then
  begin
    Memo1.Lines.Add(http.LastErrorText);
  end
  else
  begin
    Memo1.Lines.Add(resp.BodyStr);
    //CkHttpResponse_Dispose(resp);
  end;


i dobijem

Citat:
401 - Unauthorized: Access is denied due to invalid credentials.
You do not have permission to view this directory or page using the credentials that you supplied.


Istu tu poruku dobijem ako pokušam pristupiti tom URI-u preko browsera.
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 11:19 - pre 50 meseci
Rješio sa Chillkatom, kasnije napišem šta i kako. Na kraju je bila jedna velika glupost.
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 12:39 - pre 50 meseci
Evo rješenja:

Code (delphi):
var
  IdHTTP1: TIdHTTP;
  Src: string;
  LHandler: TIdSSLIOHandlerSocket;
  ssRequest: TStringStream;
  sRequest: string;
  i: integer;
  LCookieManager: TIDCookieManager;
begin
  sRequest := '{"UserName":"123","Password":"123","PersistCookie":false}';
  ssRequest := TStringStream.Create(sRequest);
  try
    IdHTTP1 := TIdHTTP.Create(nil);
    try
      LHandler := TIdSSLIOHandlerSocket.Create(self);
      LHandler.SSLOptions.Method := sslvTLSv1;
      try
        IdHTTP1.IOHandler := LHandler;
        IdHttp1.Request.CustomHeaders.Values['Content-type'] := 'application/json';

        IdHTTp1.AllowCookies := true;
        LCookieManager := TIDCookieManager.Create(self);
        IdHTTP1.CookieManager := LCookieManager;

        Src := IdHTTP1.Post('https://www.evisitor.hr/eVisit...FormsAuth/Authentication/Login', ssRequest);
        for i := 0 to LCookieManager.CookieCollection.Count - 1 do
          memo1.Lines.Add(LCookieManager.CookieCollection.Items[i].CookieText);
        //showmessage(src);
      finally
        LHandler.Free;
      end;
    finally
      IdHTTP1.Free;
    end;
  except on E: Exception do
      showmessage(E.ClassName + ': ' + E.Message);
  end;


E sada idemo dalje, moram poslati XML :D
F
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 22:01 - pre 50 meseci
Da, u pravu si za TIdSSLIOHandlerSocket, zaista je tako u starijim verzijama, pogledao sam kod sebe. Ja sam primer radio u XE2, gde je onako kako sam napisao (i gde i TIdSSLIOHandlerSocket i dalje postoji). A sta je na kraju bio problem, cookie, a? :)
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor18.11.2015. u 22:25 - pre 50 meseci
Citat:
((BugA)): Da, u pravu si za TIdSSLIOHandlerSocket, zaista je tako u starijim verzijama, pogledao sam kod sebe. Ja sam primer radio u XE2, gde je onako kako sam napisao (i gde i TIdSSLIOHandlerSocket i dalje postoji). A sta je na kraju bio problem, cookie, a? :)


Problemi su bili:

1) u URI-u mi je falilo /Login na kraju (glupost, makar su to mogli malo preciznije definirati u dokumentaciji)
2) Treba mu definirati Content-Type, bez toga ne radi

A cookie je sada problem u drugom dijelu :D
Preko Chilkata sam uspio rješiti drugi dio (slanje/post na drugi URI, sa cookiem), sa Indy još nisam ali vjerujem da hoću. Kod Chilkata je to dosta jednostavno,

Code (delphi):
http.CookieDir := 'memory';
http.SaveCookies := 1;

http.SendCookies := 1;


i on pamti/prosljeđuje cookie dok god je http živ.
Pretpostavljam da je slično i sa Indyem. Ali problem je bio doći do zaključka da je problem u cookie-u. Indy mi je stalno davao AccessViolation kod POST-a. Na kraju sam morao raditi breakpointove do takoreći posljednje funkcije POST metode da bi skužio da je problem nešto oko autentifikacije, i tu sam skužio da vjerojatno krivo prosljeđujem cookie :D Potrajalo je 2-3 sata.

Javim sutra (nadam se) gotovo rješenje.

U svakom slučaju puno hvala Bug, bilo je puno lakše započeti nakon šta si mi dao rješenje kako započeti :)
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor19.11.2015. u 10:30 - pre 50 meseci
Sa Indy-em ne ide pa ne ide.

Ili dobijem Bad response ili Internal server error, ali ne mogu dokučiti da li je do toga šta se krivo šalje cookie ili se uopće ne šalje ili je možda problem u formatu requesta, makar ne vjerujem jer sa istim requestom sve radi kod Chilkata.
F
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 902
*.dynamic.isp.telekom.rs.



+30 Profil

icon Re: Delphi Rest API e-Visitor19.11.2015. u 17:49 - pre 50 meseci
Nemam nekih iskustava sa ovim ali sam probao kod mene vraca gresku tipa Unauthorized.
Da li su dati user i pass ispravni_
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor19.11.2015. u 21:04 - pre 50 meseci
Hvala Milan, riješio sam sve.

Unauthorized ti javlja jer vrlo vjerojatno nije proslijeđen COOKIE.

Uglavnom, umjesto Exception klase sam koristio EIdHTTPProtocolException koji mi je dao malo bolja objašnjenja grešaka, tako da sam uspio sve srediti.

Prvo sam zaključio da cookie handler treba biti stalno "živ", jer ako se kreira novi i pokuša se pokupiti spremljeni cookie, to mi baš nije funkcioniralo (makar bi se i tako moglo riješiti ali treba malo više mozganja).
I drugi problem mi je bio serijalizacija JSON-a jer nisam dobivao informaciju gdje je točno greška, pa je to potrajalo.

Uglavnom, puno hvala na pomoći, posebno tebi Bug :)
F
 
Odgovor na temu

dmurk
programer
milenij

Član broj: 331419
Poruke: 2
*.rev-addr.voljatel.hr.



Profil

icon Re: Delphi Rest API e-Visitor30.11.2015. u 11:12 - pre 50 meseci
captPicard,

Da li ste uspješno riješili problem prijave gostiju preko eVisitora?
Naime, ja nikako ne mogu prijaviti gosta. Login mi uspješno prolazi, ali prilikom prijave gosta javlja grešku 'internal server error (serializationexception)'.
Vidim da ste imali sličan problem pa ako možete napisati kako ste to riješili.

Duško
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor30.11.2015. u 12:37 - pre 50 meseci
Pozdrav Duško,

jesam, riješio sam. Greška koja vam se javlja znači da vrlo vjerojatno šaljete krivi JSON, tj. neki dio JSON-a vam nije kako bi trebao biti. Javite mi se na privatnu poruku.
F
 
Odgovor na temu

dmurk
programer
milenij

Član broj: 331419
Poruke: 2
*.rev-addr.voljatel.hr.



Profil

icon Re: Delphi Rest API e-Visitor30.11.2015. u 13:34 - pre 50 meseci
captPicard,

Ne mogu Vam poslati poruku jer sam se tek prijavio na forum a treba biti acc stariji od 7 dana.
Pa ako mi možete na privat poslati vaš mail pa se čujemo preko maila dalje.

Duško
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Delphi Rest API e-Visitor30.11.2015. u 13:46 - pre 50 meseci
Poslao
F
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi Rest API e-Visitor

Strane: 1 2

[ Pregleda: 4671 | Odgovora: 23 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.