|
[ captPicard @ 06.11.2015. 14:51 ] @
| 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. |
[ ((BugA)) @ 07.11.2015. 00:11 ] @
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;
[ captPicard @ 07.11.2015. 13:02 ] @
Hvala ti Bug! Isprobam pa se javim :)
[ captPicard @ 13.11.2015. 13:17 ] @
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 :)
[ captPicard @ 17.11.2015. 10:40 ] @
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.
[ ((BugA)) @ 17.11.2015. 23:56 ] @
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 :)
[ captPicard @ 18.11.2015. 08:08 ] @
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.
[ captPicard @ 18.11.2015. 08:42 ] @
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?
[ captPicard @ 18.11.2015. 10:16 ] @
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.
[ captPicard @ 18.11.2015. 11:19 ] @
Rješio sa Chillkatom, kasnije napišem šta i kako. Na kraju je bila jedna velika glupost.
[ captPicard @ 18.11.2015. 12:39 ] @
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
[ ((BugA)) @ 18.11.2015. 22:01 ] @
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? :)
[ captPicard @ 18.11.2015. 22:25 ] @
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 :)
[ captPicard @ 19.11.2015. 10:30 ] @
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.
[ Milan Milosevic @ 19.11.2015. 17:49 ] @
Nemam nekih iskustava sa ovim ali sam probao kod mene vraca gresku tipa Unauthorized.
Da li su dati user i pass ispravni_
[ captPicard @ 19.11.2015. 21:04 ] @
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 :)
[ dmurk @ 30.11.2015. 11:12 ] @
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
[ captPicard @ 30.11.2015. 12:37 ] @
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.
[ dmurk @ 30.11.2015. 13:34 ] @
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
[ captPicard @ 30.11.2015. 13:46 ] @
Poslao 
[ marekius @ 04.05.2016. 13:07 ] @
http://static.elitesecurity.org/angry.gif
Imam problem sa prijavom gosta u evisitor ali ne znam gdje griješim ima li tko ideju ili primjer sve primam http://static.elitesecurity.org/smile4.gif
vIDHTTP.Post(vURI+'/Rest/Htz/CheckInTourist/',TStringStream.Create(
' {'+
'"Facility":"0000033",' +
'"StayFrom":"20160504",'+
'"TimeStayFrom":"12:44",'+
'"ForeseenStayUntil":"20160811",'+
'"TimeEstimatedStayUntil":"11:32",'+
'"DocumentType":"008",'+
'"DocumentNumber":"nn1",'+
'"TouristName":"Jurica",'+
'"TouristMiddleName":"Jura",'+
'"TouristSurname":"Ribar",'+
'"Gender":"ženski",'+
'"CountryOfBirth":"RUS",'+
'"CityOfBirth":"Moskva",'+
'"Citizenship":"RUS",'+
'"VisaValidityDate":"20160309",' +
'"VisaType":"Putna viza",' +
'"VisaNumber":"0001",' +
'"CountryOfResidence":"RUS",' +
'"CityOfResidence":"Moskva",' +
'"ResidenceAddress":"aa1",' +
'"PassageDate":"20160309",' +
'"BorderCrossing":"053",' +
'"TTPaymentCategory":"12",' +
'"ArrivalOrganisation":"I",' +
'"OfferedServiceType":"nočenje",' +
'"DateOfBirth":"20150309"' +
'}'
));
[ captPicard @ 04.05.2016. 15:55 ] @
Za početak, koju grešku ti daje?
[ marekius @ 05.05.2016. 08:13 ] @
skužio sam da je problem u ŠĐŽČĆšđžčć ali sad je pitanje kak postavit pravu kodnu stranicu u INDY
[ captPicard @ 05.05.2016. 09:08 ] @
Prije nego posaljes string iskoristi funkciju UTF8Encode i to je to.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|