Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 23 odgovora
  • 8.600 pregleda

Najnovija ↓

Delphi Rest API e-Visitor 06.11.2015. u 15:51 · pre 133 meseca #1
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.
Potpis
F
Re: Delphi Rest API e-Visitor 07.11.2015. u 01:11 · pre 133 meseca #2
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;
Re: Delphi Rest API e-Visitor 13.11.2015. u 14:17 · pre 133 meseca #4
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 :)
Potpis
F
Re: Delphi Rest API e-Visitor 17.11.2015. u 11:40 · pre 133 meseca #5
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.
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 00:56 · pre 133 meseca #6
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 :)
Re: Delphi Rest API e-Visitor 18.11.2015. u 09:08 · pre 133 meseca #7
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.
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 09:42 · pre 133 meseca #8
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?
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 11:16 · pre 133 meseca #9
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.
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 12:19 · pre 133 meseca #10
Rješio sa Chillkatom, kasnije napišem šta i kako. Na kraju je bila jedna velika glupost.
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 13:39 · pre 133 meseca #11
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
Potpis
F
Re: Delphi Rest API e-Visitor 18.11.2015. u 23:01 · pre 133 meseca #12
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? :)
Re: Delphi Rest API e-Visitor 18.11.2015. u 23:25 · pre 133 meseca #13
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 :)
Potpis
F
Re: Delphi Rest API e-Visitor 19.11.2015. u 11:30 · pre 133 meseca #14
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.
Potpis
F
Re: Delphi Rest API e-Visitor 19.11.2015. u 18:49 · pre 133 meseca #15
Nemam nekih iskustava sa ovim ali sam probao kod mene vraca gresku tipa Unauthorized.
Da li su dati user i pass ispravni_
Re: Delphi Rest API e-Visitor 19.11.2015. u 22:04 · pre 133 meseca #16
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 :)
Potpis
F
Re: Delphi Rest API e-Visitor 30.11.2015. u 12:12 · pre 132 meseca #17
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
Re: Delphi Rest API e-Visitor 30.11.2015. u 13:37 · pre 132 meseca #18
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.
Potpis
F
Re: Delphi Rest API e-Visitor 30.11.2015. u 14:34 · pre 132 meseca #19
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
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme