Autor Zpráva
axanet
Profil *
Ahoj. Řeším problém aktualizace stránky pomocí ajaxu resp. způsobu předávání dat. Dejme tomu že mám stránku na které je tabulka. Pokud kliknu na řádek tabulky, chci aby se smazal - jistě je blbost načítat kvůli tomu znovu celou tabulku (zvlášť pokud by bylo její generování nějak náročné). Proto by bylo dobré zavolat jen příkaz smazRadek a zjistit jeho výsledek a na základě toho javascriptem ten řádek tabulky smazat. Jak takové informace ale předávat? Normálně jako plaintext bez tagů nebo v nějaké struktuře xml nebo jak se tohle vlastně v praxi řeší?
_es
Profil
axanet:
Jak takové informace ale předávat?
Ľubovoľne, podľa vlastnej fantázie, ešte sa okrem spôsobov, čo si vymenoval, môže použiť napríklad aj JSON.
joe
Profil
Nejlepší řešení bude asi JSON, XML je zvytečně moc roztahané (objemné, i když u takové věci to je prakticky jedno).

A pak můžeš vracet JSON data ve formátu:

{
    'status' : 'fail',
    'message' : 'Nastala chyba ...'
}
axanet
Profil *
A jakým způsobem se odstiňuje uživatel od komunikace prohlížeč(js) vs. server(php)? Řeší se to nějak aby uživatel nemohl sám zadat url a data posílané ajaxem nebo se to jenom "schová".
Medvídek
Profil
axanet:
Vždycky to musíš mít ošetřený, protože i když se to posílá AJAXem, tak není problém tu url vyčíst.
joe
Profil
Medvídek:
Vždycky to musíš mít ošetřený
Můžeš to rozvést, prosím?
Medvídek
Profil
joe:
No na straně toho skriptu. Pokud se má něco odmazávat, tak na straně kriptu zajistit, aby to mohl odmazávat ten, kdo na to má práva. (Třeba přes SESSION).
joe
Profil
Medvídek:
Nevím jestli to bylo přesně to, na co se axanet ptal. Myslím, že mu šlo spíše o to, aby mohl z JavaScriptu volat nějakou URL, ale po zadání URL adresy (té samé jako v JS) přímo do adresního řádku se neprovedlo nic.

axanet:
K tomu se používá HTTP hlavička X-Requested-With, podle které poznáš, zda jde o AJAX požadavek nebo ne.
Chamurappi
Profil
Reaguji na joa:
Jak přistupují k takové hlavičce proxy servery? Podporují ji běžně?
joe
Profil
Chamurappi:
Vím jen, že se to tak používá. Jestli s tím je nějaký problém, pokud je přístup přes proxy, jsem se nezajímal. Možná bys to mohl napsat, když to určitě víš a jen mě zkoušíš :-)
Chamurappi
Profil
Reaguji na joa:
Nevím. Ale problém bych očekával, protože třeba zrovna proxy server, za kterým se docela často nacházím, je schopen nakešovat prakticky cokoliv. Takže očekávám, že dostanu i zdroj načtený původně s nějakou nestandardní hlavičkou, pokud si stejnou adresu zadám normálně do prohlížeče.
joe
Profil
Chamurappi:
Tak to jsem špatně odhadnul. Už rozumím, na co narážíš, zkusil jsem něco najít a skoro žádné problémy jsem s tím nenašel. Takže pokud je stejná adresa pro AJAX (řekněme, že vrací nějaká JSON data) a non-AJAX požadavek a kontroluje se pouze ta hlavička X-Requested-With a ty napřed uděláš ten AJAX požadavek a pak si tu samou adresu otevřeš do nového okna, dostaneš JSON data? :-) A nezabírají ani hlavičky, které mají cache vypnout?

V komentářích článku detekování AJAXu, píše Jason (on August 2, 2009 @ 5:58 pm), že ani hlavičky pro cache nemusí jít.

Tak pak by mělo stačit při každém AJAX požadavku přidat do URL nějaký čas, ne?

Ale zatím jsem nikde neviděl, že by s tím měl někdo problém a něco takového dělal, protože pak se připravuje o cache, i když někdy to je žádoucí.
axanet
Profil *
Takže se v praxi nakonec používá něco jako http://server.cz/index.php?cil=tabulka&akce=smazat&radek=10&ajak=ano ? Marně jsem se totiž zkoušel některými "ajaxovými projekty" prokousat - jsou moc komplikované a nevidím to v tom.
joe
Profil
axanet:
Pokud měl být poslední parametr &ajax=ano, tak ne. Celkem dobře napsané to je tady, jen tam ještě chybí hlavičky HTTP požadavku.

Po tomto řádku
httpRequest.open("GET", stranka, true);

je třeba ještě přidat
httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

a další případné potřebné hlavičky.

Adresa by tedy zůstala: http://server.cz/index.php?cil=tabulka&akce=smazat&radek=10

A v PHP by jsi zjistil, jestli se jedná o AJAX požadavek:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
// AJAX
}
_es
Profil
Ak sa niečo maže, tak by to principiálne malo byť nie cez metódu GET, ale cez metódu POST.
pcmanik
Profil
_es:
Preco? Ved ked predavas premennu v adrese, mas zbytocne pouzivat post, nakolko sa vacsinou predava len id.
_es
Profil
pcmanik:
Preco?
Jedným z dôvodov je napríklad zabránenie postupu v [#4] axanet.
A nemusí ísť len o zabránenie tomu, aby na zmazanie dát stačila požiadavka na načítanie súboru. Adresa s GET parametrami je aj rôznymi strojmi považovaná za „neškodnú“, nič nemeniacu, adresu a preto by pri nesplnení tohoto predpokladu mohlo nastávať neočakávané mazanie dát z databáze.
joe
Profil
_es:
Pokud dáš adresu do prohlížeče, tak ji asi neodešleš s hlavičkou HTTP_X_REQUESTED_WITH, ne?

Pokud děláš administraci, akce smazání (například článků) řešíš přes POST? Zatím jsem se v takovém případě s POST metodou snad ani nesetkal, jen s pouhým odkazem, doplněným o token.
_es
Profil
joe:
Pokud dáš adresu do prohlížeče, tak ji asi neodešleš s hlavičkou HTTP_X_REQUESTED_WITH, ne?
Myslím, že Chamurappi sa v [#11] snažil naznačiť, že by k tomu dôjsť mohlo a nemusí ísť len o požiadavku zaslanú prehliadačom.
Navyše je potom odoslanie cez GET náročnejšie o pridanie tej hlavičky a jej kontrolu.
A aj menej bezpečné - hocikto s prístupom len k logu vyžiadaných adries môže potom ľubovoľne mazať dáta.
pcmanik
Profil
_es:
Je celkom logicke, ze na servery si overis aspon ci je uzivatel prihlaseny a ma pravo mazat tie veci, to iste plati aj u postu, takze tym sa nic neriesi a len blazon by sa spoliehal na to ze post je bezpecnejsi. Metoda Post je rovnako nebezpecna, mozes menit obsah jej obsah, takze to nic neriesi, a naviac GET je menej narocny na vykon ako POST. Jednoducho pre male data je tu GET pre velke je tu POST.
axanet
Profil *
Také používám pro mazání GET - zatím tedy bez ajaxu, ale je to rychlejší vygenerovat 1000 odkazů než 1000 formulářů nebo než použivat jen javascript. Tu hlavičku HTTP_X_REQUESTED_WITH bych nerad použil, pokud je nějaká možnost že by to proxy nepodporovala (jak bylo uvedeno výše).
joe
Profil
_es:
Myslím, že Chamurappi sa v [#11] snažil naznačiť ...
Řekl bych, že přidáním nějaké proměnné s časem tento problém řeší, navíc tuto hlavičku používají i různé frameworky a nikdo si zatím neztěžoval.

Navyše je potom odoslanie cez GET náročnejšie o pridanie tej hlavičky a jej kontrolu.
To není o moc náročnější, jak jinak bys chtěl rozeznávat AJAX požadavky..?

A aj menej bezpečné - hocikto s prístupom len k logu vyžiadaných adries môže potom ľubovoľne mazať dáta.
Je samozřejmé, že se kontroluje SESSION na serveru, zda k tomu jsou práva.

Je to použité i v Nette Frameworku - isAjax()

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0