Ať je webové rozhraní sebelepší, komfortu desktopové aplikace se málokdy vyrovná. Technologie XML-RPC a webových služeb nám dávají jednoduše využitelnou možnost, jak zkombinovat výhody webu a tlustého klienta. V případě publikačních systémů je dobrý nápad umožnit vašim uživatelům psát příspěvky z prostředí, které je jim důvěrně známé. Například z Microsoft Wordu nebo něčemu, co se mu podobá.
Představení MetaWeblog API
MetaWeblog API je komunikační rozhraní postavené na platformě XML-RPC. Pomocí tohoto rozhraní a klienta, který s ním umí pracovat, je možno na webu vytvářet nové články, editovat původní, nahrávat obrázky a podobně.
Vhodným klientem může být například Microsoft Word 2007 nebo novinka, t. č. v beta 2 verzi, Windows Live Writer. Takový klient umožní pohodlně psát články, ale i vkládat odkazy a obrázky, včetně automatického generování náhledů a odkazů na původní obrázek.
Popis implementace tohoto API (včetně poznámek z praxe) najdete například na webu VBNET.CZ. Podpora XML-RPC není narozdíl od WS-I v .NETu vestavěná, ale existuje knihovna XML-RPC.NET, která tento nedostatek nahrazuje.
Omezení MetaWeblogu a jak je obejít
Toto API bylo navrženo pro jednoduché osobní blogy a nemusí vyhovovat komplexnějším publikačním systémům. Za jeho zásadní nevýhodu považuji nemožnost určovat kromě vlastního textu článku též jeho abstrakt, nebo chcete-li perex: krátký úvodní text, který má přilákat čtenáře v RSS feedu nebo v přehledu článků. Tento problém jsem vyřešil tím, že jsem implementoval jistou specifickou metodu parsování obsahu: pokud je první element v textu článku <blockquote>, pak se jeho obsah považuje za abstrakt článku.
Další nevýhodou je nemožnost specifikovat u článku jeho autora - předpokládá se, že každý blog bude mít jenom jednoho. Toto API je tedy samo o sobě nepoužitelné pro schéma, kdy jeden redaktor zadává články ostatních přispěvatelů. Pro účely Nemesis jsem ho vyřešil tím, že jsem propojil uživatele (pod jehož identifikací se klient hlásí) s autorem článku, ale v některých případech by to mohlo znamenat zásadní problém.
Obě dvě tyto nesnáze a spoustu dalších řeší jiná norma, jménem Movable Type API. Ta je služebně mladší, méně široce podporovaná a náročnější na implementaci, takže jsem ji zatím nepoužil.
Autodiscovery
Klíčem k bohatství webu je znát správné URL - adresu zdroje. Adresy určené lidem bývají v dnešní době již docela srozumitelné, ale pro endpointy služeb konzumovaných počítačovými programy to neplatí. Moderní publikační systémy jich ale nabízejí pěknou řádku. Proto je vhodné mít způsob, jak umožnit klientskému software, aby z jednoduché adresy pro lidi vyčetl vše potřebné.
Tomuto mechanismu se říká "autodiscovery" a jeho technická podstata spočívá v tom, že se do HTML kódu stránky (obvykle titulní) umístí element <link> s patřičnými parametry. Klientovi pak stačí prozradit adresu domovské stránky. On si proparsuje získané HTML a z něj pak vyčte reálnou adresu služby, na kterou se má připojit.
Typickým příkladem autodiscovery je podpora technologie OpenSearch v Internet Exploreru 7, o které jsem zde již před časem psal. Dalším často vídaným mechanismem je přidání systemizovaného odkazu na RSS feed, díky kterému se pak v prohlížeči zvýrazní ikonka RSS pro přidání do seznamu:
<link rel="alternate"
type="application/rss+xml"
title="ASPNET.CZ: Nově vydané články"
href="http://www.aspnet.cz/ArticleRss.ashx" />
Autodiscovery adresy MW-API endpointu
Autodiscovery v našem případě (podobně jako u OpenSearch) sestává ze dvou kroků. V prvním specifikujeme adresu XML dokumentu, který popisuje vlastnosti editačního rozhraní blogu. To se děje klasicky pomocí elementu <link>:
<link rel="EditURI"
type="application/rsd+xml"
href="http://www.aspnet.cz/AutoDiscovery.ashx?type=RSD"
title="RSD" />
Ve druhém kroku klient přečte požadovaný XML dokument a načte z něj parametry pro připojení. Můj XML dokument vypadá takto:
<?xml version="1.0" encoding="utf-8" ?>
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
<service>
<engineName>Nemesis Publishing</engineName>
<engineLink>http://www.nemesis.cz/</engineLink>
<homePageLink>http://www.aspnet.cz</homePageLink>
<apis>
<api name="MetaWeblog" preferred="true" apiLink="http://www.aspnet.cz/MetaIO.ashx" blogId="aspnetcz" />
</apis>
</service>
</rsd>
Klíčový je element <apis>, který obsahuje seznam všech API, pomocí kterých je možno s weblogem komunikovat. Pro jednotlivá API pak specifikuje parametry pro připojení. V našem případě říká, že můj weblog používá interface MetaWeblog a jeho endpoint se nachází na http://www.aspnet.cz/MetaIO.ashx.
Podrobný popis formátu RSD (Really Simple Discoverability) najdete na webu jeho autora.
Rozšíření pro Windows Live Writer
Windows Live Writer možnosti editačních API dále rozšiřuje. Umožňuje jim sdělit, jaké volitelné části specifikace implementují. Dále pak rozšiřuje možnosti editace, protože nabízí webu možnost vygenerovat náhledovou stránku, takže umožní zobrazit přímo v editoru náhled, jak bude článek vypadat, až bude publikován.
Tato činnost má tři kroky. V prvním se opět prohledává titulní stránka a hledá se v ní patřičný element <link>:
<link rel="wlwmanifest"
type="application/wlwmanifest+xml"
href="http://www.aspnet.cz/AutoDiscovery.ashx?type=WLW"
title="WLW manifest" />
Ve druhém kroku se stáhne XML dokument, který popisuje vlastnosti našeho interface:
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
<options>
<clientType>Metaweblog</clientType>
<supportsMultipleCategories>No</supportsMultipleCategories>
</options>
<weblog>
<serviceName>ASPNET.CZ</serviceName>
<homepageLinkText>Zobrazit weblog</homepageLinkText>
<adminLinkText>Administrace</adminLinkText>
<adminUrl>http://www.aspnet.cz/Administration/</adminUrl>
</weblog>
<views>
<view type="WebLayout" src="http://www.aspnet.cz/ArticlePreview.aspx" />
<view type="WebPreview" src="http://www.aspnet.cz/ArticlePreview.aspx" />
</views>
</manifest>
Podrobný popis formátu souboru a všech jeho možností najdete ve Windows Live Writer SDK na webu MSDN Library. Můj dokument klientovi říká, že tento weblog podporuje všechny funkce MetaWeblog API, kromě možnosti přidat článek do více kategorií. Dále ho pak odkazuje na adresu http://www.aspnet.cz/ArticlePreview.aspx, kde si může stáhnout šablonu naznačující, jak bude článek vypadat po publikaci.
Jak to všechno funguje dohromady
Přidání nového účtu do Live Writeru je díky technologii autodiscovery pro uživatele velmi jednoduché: stačí aby zadal adresu domovské stránky, login a heslo. Všechny ostatní údaje si Live Writer umí zjistit automaticky. Skrývá se za tím následující postup:
- Writer si stáhne domovskou stránku (v našem případě ze zadané adresy http://www.aspnet.cz/) a proparsuje ji na relevantní HTML tagy <link>.
- Z adresy http://www.aspnet.cz/AutoDiscovery.ashx?type=RSD si stáhne XML dokument, z něhož se dozví, že můj web podporuje MW API a že adresa jeho endpointu je http://www.aspnet.cz/MetaIO.ashx.
- Z adresy http://www.aspnet.cz/AutoDiscovery.ashx?type=WLW si stáhne XML dokument, z něhož se dozví, že blog podporuje jenom jednu kategorii na článek a podle toho uzpůsobí své uživatelské rozhraní.
- Dále se z tohoto dokumentu dozví, že na adrese http://www.aspnet.cz/ArticlePreview.aspx si má stáhnout šablonu článku.