Delphi7+Synapse+Cookies

Programovacie jazyky, rady, poradňa...
4JOKE
Light Star
Light Star
Príspevky: 269
Registrovaný: 10 sep 2005, 10:23

Delphi7+Synapse+Cookies

Príspevok od používateľa 4JOKE »

Pouzivam Delhi7 so synapse kniznicami pre odoslanie nejakych udajov do formulara na web stranke.

- cez funkciu HttpPostUrl poslem udaje do formulara a naspat mi funkcia posle cookie, teda ci sa podarilo prihlasit.
- ked hned nato znova poslem cez HttpPosturl udaje do druheho formulara na tej stranke, tak dostanem odpoved ze uz niesom prihlaseny, cize hned ako som som prvy krat prihlasil cez HttpPostUrl, tak cookie sa vymazalo.
-vedel by sa niekto nato pozriet ako nastavit tej funkcii aby to Cookie nevymazavala? ale vymazalaho az ked ja budem potrebovat?
-skusal som rozne pozmenit kod, ale nic mi nepomohlo, nakolko sa do delphi az tak nevyznam a v tych ich knizniciach sa vyznam fakt len strucne.


Zdroj: http://synapse.ararat.cz/
http://synapse.ararat.cz/files/synapse.zip

thnx.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Cookies ti prídu v http hlavičke odpovede. Ti ich odtiaľ musíš vybrať a pri ďalšom kontakte so serverom tie cookies vložíš do http hlavičky žiadosti.
4JOKE
Light Star
Light Star
Príspevky: 269
Registrovaný: 10 sep 2005, 10:23

Príspevok od používateľa 4JOKE »

chrono napísal:Cookies ti prídu v http hlavičke odpovede. Ti ich odtiaľ musíš vybrať a pri ďalšom kontakte so serverom tie cookies vložíš do http hlavičky žiadosti.
mno tie cookies dostanem ako Tstringlist, mno ako ich potom vlozit do nasledujucej ziadosti? hmm, skusim sa nato pozriet ale pochybujem ze to tam najdem...


toto je ta HttpPostUrl funkcia:

Kód: Vybrať všetko

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;
...z toho sa mi to tak zda ze bude muset to vlozit do hlavicky, coz najdem az vo funkcii HTTPMethod, nie?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Budeš si musieť urobiť podobnú funkciu ako je HttpPostURL. Budeš tam musieť pridať aj možnosť pridávania položiek do HTTP hlavičky (alebo aspoň cookies).

Keď tak na to pozerám, stačilo by, ak by si si vytvoril objekt THTTPSend a používal ten. Ak pomocou neho načítaš stránku, budú tam uložené aj cookies a pri ďalšej žiadosti o stránku sa automaticky odošlú. Funkcia HttpPostURL pri každom použití vytvorí nový THTTPSend objekt, ktorý nemá cookies nastavené.

// chrono: Ak budeš robiť podobnú funkciu ako je HttpPostUrl budeš musieť nastaviť cookies ešte pred Result := HTTP.HTTPMethod('POST', URL); Pred ten riadok pridat HTTP.Cookies := cookies; (cookies by mal byť TStringList)
4JOKE
Light Star
Light Star
Príspevky: 269
Registrovaný: 10 sep 2005, 10:23

Príspevok od používateľa 4JOKE »

skusil som to este vlozit pred ten result, no vypisalo mi to:

[Error] HTTPSend.pas(776): Cannot assign to a read-only property


//edit: dik moc, uz som to vyriesil, len som nastavil premennu na aj write, dokonca som daco podobne aj skusal a neviem preco som vtedy tiez nenastavil ten write...

...este raz, dik moc.


BTW, to cookie co sa vytvori, tak ono sa nikde na PC neuklada ako pri normalnom browsovani nie?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Musíš ho niekam uložiť sám.
4JOKE
Light Star
Light Star
Príspevky: 269
Registrovaný: 10 sep 2005, 10:23

Príspevok od používateľa 4JOKE »

chrono napísal:Musíš ho niekam uložiť sám.
Ok. Ja som sa prave pytal preto, lebo som nechcel aby sa to ukladalo.
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

aj ja

Príspevok od používateľa feromakovi »

zdravím mám tiež problém s tou funkciou:
mám niečo takéto:

Kód: Vybrať všetko

uses httpsend,synacode;
datako:Tstream;
dotej premmennej typu datako som nevkladal nič neviem presne čo je to TStream a možno to bude súvisieť s tým

Kód: Vybrať všetko

if httpPostURL('http://www.feromakovi.tym.sk/skuska/skola.php',EncodeURLElement('line=všeliaký text&user=Meno Užívateľa'),datako) then showmessage('dobre')
else showmessage('sračky');
a vôbec neviem kde mám chybu so chcel len posielať tie url data do formulára php a nech ten s tými premennými pracuje...ale ani mi nevypíše chybu len ak kliknem na button tak počká a potom že exeption

a na tomto riadku v tej funkcií mi ukáže chybu alebo teda mi ju vyznačí:

Kód: Vybrať všetko

Data.CopyFrom(HTTP.Document, 0);
a ešte jedna vec čo mi není jasná čo ste riešili s tými cookies lebo mi sme sa učili že to je v PC a sú tam zapísané stránky ktoré som navštívil prípadne heslá a tak...dalo by sa keby mi aj tie cookies niekto vysvetlil?? že k čomu to slúži keď niečo posielam do formulára a pod??
ďakujem
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Predpokladám, že tomu vadí to, že si ten stream nevytvoril (ale posielaš tam len náhodný obsah, ktorý sa nachádza na tom mieste, kde je premenná).

Cookies sú spôsob, akým sa umožní serveru uložiť nejaké údaje v klientovi (teda často v prehliadači). Pri posielaní formuláru nemusí byť cookie potrebné (to záleží od toho, čo presne to má robiť).

Inak v tom streame potom bude odpoveď, ktorú poslal server.
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

to

Príspevok od používateľa feromakovi »

ahá ďakujem za vysvetlenie...ale mám ešte otázku že čo znamená vytvoriť stream...zatial som vždy len normálne programoval tak že som si premenné zadeklaroval a bolo...a teraz to treba aj nejako vytvárať??

BTW: ja od servera nepotrebujem žiadnu odpoveď hlavne nech tam pošle tie dve premenné formou post...inak spýtam sa aj takto že či nebude potom tomu php kódu vadiť že to posielam formou post a v zdrojáku php mám get...či to bude alebo nebude fungovať...

a posledná otázka, že v tom streame sa mi vráti akože čo zo stránky?? celý zdrojový kód?? alebo len nejaké nevyhnutné časti?

za odpovede ti vopred ďakujem :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Je úplne jedno, že ty nechceš žiadnu odpoveď. Tá knižnica je urobená tak, že do toho streamu tú odpoveď vloží (aj keď ju nechceš). Bude tam presne to, čo pošle server (ak pošle html kód, tak to bude html kód, ak pošle obrázok, tak tam bude obrázok...).

Objekt triedy TStream nevytvoríš (keďže tá trieda je abstraktná), ale môžeš vytvoriť napr. TMemoryStream (prípadne aj TStringStream).

S tým TMemoryStream by to vyzeralo približne takto:

Kód: Vybrať všetko

stream :TMemoryStream;

stream := TMemoryStream.Create;
if httpPostURL('http://www.feromakovi.tym.sk/skuska/skola.php',EncodeURLElement('line=všeliaký text&user=Meno Užívateľa'), stream) then showmessage('dobre') 
 else showmessage('sračky');
stream.Free;
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

ok

Príspevok od používateľa feromakovi »

uf diki moc...už mi aspoň dáva funkcia hodnotu true a nepadá mi program:D....no mám ešte zopár otázok..viem že už som otravný ale eď ma to zaujíma:
použil som to na takýto script:

Kód: Vybrať všetko

<?php 
  $fp=FOpen($user,"a"); 
  FWrite($fp,$line."\n"); 
  FClose($fp); 
?>
potom som skúsil aj takýto:

Kód: Vybrať všetko

<?php 
  $fp=FOpen($_GET['user'],"a"); 
  FWrite($fp,$_GET['line']."\n"); 
  FClose($fp); 
?>
normálne bez programu mi to funguje cez ten druhý s tým get...ale skúšal som obe a nič napísalo že dobre ale žiaden súbor mi to na ftp nevytvorilo...kde môže byť teraz problém??

a ešte otázočka..že ako bližšie sa pracuje s tým TMemoryStream...lebo do mema sa napr dá stream vypísať...ale tento MemoryStream keď dám že memo1.lines.loadfromstream(stream);
síce ma to pustí ale nič nevypíše...ja som čakal že mi to tam vypíše celý zdroják aj s odkazmi a pod...?? ako by som sa k tomu čo je v premennej stream mohol dostať??
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

k tej prvej otázka: nezapisuje preto, že to posielaš cez post a v php pristupuješ k premenným posielaným cez get. A k tej druhej: TMemoryStream do memam nevypíšeš, budeš si musieť namiesto neho spraviť TStringStream. Postup bude rovnaký ako napísal chrono vyššie
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

aha

Príspevok od používateľa feromakovi »

aha no ja som sa držal tohto:

Kód: Vybrať všetko

Jako metodu předání dat jsme určili GET, data teda budou předána jako součást URL. Při použití metody POST by však vše fungovalo stejně.
je to z lekcií jak na php...tak som myslel že to bude to isté
a potom som si myslelže ten prvý kód bude akože tá metóda POST a ten druhý script to je metóda GET...
a mohol by som sa spýtať ako by to vyzeralo keby som použil metódu POST(akože ten script)...
alebo nedala by sa použiť nejaká iná funkcia zo synapse čo by to posielala ako GET??

//edit:
a keď vytvorím že:
stream:=TStringStream.create; tak mi napíše že mi chýba parameter string
tak som to upravil na stream:=TStringStream.create('string');
compilátor už je spokojný ale do mema sa mi to aj tak nevypíše.. tu je kde chyba??
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Zmeň v tom php _GET na _POST a malo by ti to fungovať (a ak je tých údajov viac, _POST je bezpečnejšie, keďže dĺžka URL je obmedzená).

PS: Ten prvý zápis fungoval v php3. V novších verziách funguje len ak je v php zapnuté register_globals.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: aha

Príspevok od používateľa audiotrack »

to čo sa píše v tých "lekciach php" by bola pravda keby si používal registrované superglobálne premenné, a teda taka ko si to mal najprv. To ti nešlo (vďaka bohu) a zmenil si to, ale potom to už nie je jedno. Keď tam dáš _GET tak ti to _POST brať nebude (a a naopak).
Máš teda dve možnosti:
1) zmeniť v php _GET za _POST (čo je lepšie riešenie, viď zase chronov príspevok o dlžke url ^)
2) poslať to ako get:

Kód: Vybrať všetko

httpPostURL('http://www.feromakovi.tym.sk/skuska/skola.php?'+EncodeURLElement('line=všeliaký text&user=Meno Užívateľa'),'', stream) then showmessage('dobre')
nejak takto by to mohlo ísť. Ale možno tam je metoda aj na posielanie get, nechce sa mi teraz hladať

//edit: tak je to HttpGetText

Kód: Vybrať všetko

function HttpGetText(const URL: string; const Response: TStrings): Boolean;
feromakovi
Expert
Expert
Príspevky: 165
Registrovaný: 24 okt 2008, 14:16
Bydlisko: Bánovce nad Bebravou

ok

Príspevok od používateľa feromakovi »

ok pohoda veď keď je tá POST metóda lepšie riešenie ja si rád nechám poradiť...
ale rád by som sa spýtal na tú premennú TStringStream

Kód: Vybrať všetko

var stream:TstringStream;
.
.
.
stream:=TStringStream.Create('string');//ten string tam odomňa pýtalo tak som napísal prvé čo mi napadlo
if httpPostURL('http://www.feromakovi.tym.sk/a/prog.php','line=text1&user=aaa.txt', stream) then showmessage('dobre')
 else showmessage('sračky');
 memo1.Lines.LoadFromStream(stream);
stream.Free;
a do toho mema mi aj tak nič nevypíše čím to je??
paralen
Light Star
Light Star
Príspevky: 267
Registrovaný: 02 máj 2006, 15:15

Príspevok od používateľa paralen »

Tiez som sa s tym niekedy "mordoval" :D a nakoniec mi to fungovalo takto

Kód: Vybrať všetko

var stream:TStringStream;
begin
  stream:=TStringStream.Create('');

if httpPostURL('http://www.feromakovi.tym.sk/a/prog.php','line=text1&user=aaa.txt', stream) then showmessage('dobre')
 else showmessage('sračky');
 stream.Seek(0, soFromBeginning);
 memo1.Lines.text:= stream.readString(stream.Size);

stream.Free;
Napísať odpoveď