Atom a RSS - jak je zobrazit v prohlížeči a ETag
To, že RSS feedy (verze 0.9x, 1.0 a 2.0) a Atom 0.3 umí RSS a Atom čtečky je jasné. Nicméně, není od věci linkovat těmto zdrojům i CSS stylesheet, a umožnit jejich zobrazení v normálním prohlížeči (a v stylesheety podporujících čtečkách).
V případě moderního Atom 0.3 feedu včetně informace pro uživatele, které jej informuje o faktu, že tento zdroj není primárně určen pro prohlížeč, ale pro čtečku.
Jak ale na zobrazení v browseru? Prvním problémem je samozřejmě fakt, že MSIE 6.0 SP1 nezvládá MIME typ application/xhtml+xml. Podporuje jen text/html. Různými pokusy jsem dospěl k tomu, že jediný MIME typ, na kterém se prohlížeče shodnou, a který podporují i čtečky, je pro RSS a Atom: text/xml!
Tento MIME typ posílám jako:
header('Content-Type: text/xml')
… pro MSIE 6.0, Operu 7.50 i Firefox 0.8, i pro čtečky, a vypadá to, že vše funguje jak má.
Ještě jedna zajímavá věc tu je, pokud pošlu:
header('Content-Type: text/xml; charset=iso-8859-2');
… tak to MSIE 6.0 nezvládne a nedělá nic. Opera a Firefox fungují. Pokud oddělám charset, a dám jej jako první deklaraci v XML, tedy:
<?xml version="1.0" encoding="iso-8859-2" standalone="yes"?>
… tak je vše v pořádku, včetně kódování, ve všech testovaných browserech a RSS / Atom čtečkách.
Druhou věcí, kterou jsem udělal pro všechny feedy je to, že je neposílám znovu, pokud header ETag je shodný s MD5 (hash key feedu), který má již čtečka načten. Šetří to mraky přenosového pásma a dotazů do databáze (u těch instalací, které nepoužívají NP_Cache; a u čteček, které to podporují). Šlo by testovat ještě Last-Modified, ale… není to nutné.
Jak na ETag? Třeba následovně (příklad je pro Atom 0.3 feed):
// get feed into $feed
ob_start();
// select and render skin
selectSkin('atom');
selector();
$feed = ob_get_contents();
ob_end_clean();
// create ETAG (hash of feed)
$eTag = '"'.md5($feed).'"';
header('Etag: '.$eTag);
// compare Etag to what we got
if ($eTag == serverVar('HTTP_IF_NONE_MATCH')) {
header("HTTP/1.0 304 Not Modified");
header('Content-Length: 0');
else
// dump feed
echo $feed;
Můžete si to otestovat zde:
| Feed | URI |
| xml-rss.php | RSS 0.91 perex |
| xml-rss.php?full=yes | RSS 0.91 celé články |
| xml-rss1.php | RSS 1.0 perex |
| xml-rss1.php?full=yes | RSS 1.0 celé články |
| xml-rss2.php | RSS 2.0 perex |
| xml-rss2.php?full=yes | RSS 2.0 celé články |
| action.php?name=RSSBlog | RSS 2.0 komentářů |
| atom.php | Atom 0.3 feed (!) |
Připravil jsem rovněž kompletní balíček těchto feedů pro Nucleus XE 3.0 FINAL. Instalaci proveďte následovně:
- překopírujte na FTP veškeré přiložené soubory.
- proveďte import skinů, s přepsáním stávajících.
- pokud používáte ExtraSkin, vložte obsah rss.inc souboru do ExtraSkinu nazvaného rss.
- de-instalujte a opět instalujte pluginy NP_RSSBlog, NP_XMLTools a NP_RSSItem.
Download: https://myego.cz/other/atomrss.zip (27 kB).
Veškeré feedy jsou samozřejmě plně validní a mají připojen CSS stylesheet :) Doufám, že Atom 0.3 nabídne více a více webů, RSS fakt přestává stačit…
Malá informace zdarma - přestože je většina webdesignérů přesvědčena o opaku, správným MIME typem pro XML feedy typu RSS skutečně je "text/xml". I selskou logikou lze dojít k poznání, že XML není v tomto případě žádnou aplikací, ale jednoduchým textovým souborem ;-)
Čau, tak mě napadlo - nechceš udělat v Atomu i příspěvky?