Open Data Protocol pro PHPkáře

Na internetu najdete obrovské množství informací. To platí ovšem pro člověka. Pokud tyto informace chce zpracovávat počítač, tak to může být velmi obtížné.

Autor: Štěpán Bechynský, Microsoft

Formát HTML, ve kterém se informace publikují, je primárně určen pro lidi a některé důležité informace se v něm ztrácejí, i když v původním zdroji informace byla. Malý příklad:

Dlouhá 8

Asi odhadneme, že se jedná o jméno ulice, ale co znamená číslo 8? Je to číslo popisné nebo orientační? Člověk to bude schopen na základě svých životních zkušeností velmi pravděpodobně uhodnout. Takto malé číslo bude pravděpodobně číslo orientační, které určuje pořadí budovy v ulici. Ale nemusí to tak být. Pokud půjde o malé sídlo, tak to klidně může být číslo popisné (http://cs.wikipedia.org/wiki/%C4%8C%C3%ADslo_popisn%C3%A9).

Pokud už jsou informace publikovány ve strukturované podobě, tak každý poskytovatel informace má svůj vlastní formát. Příkladem může být naše státní správa. Informace o podnikatelských subjektech ve strukturované podobě najdete na serveru ARES (http://wwwinfo.mfcr.cz/ares/ares.html.cz). Popis formátu je pak v sekci XML SLUŽBY. Každý podnikatelský subjekt má tzv. OKEČ, který určuje obor činnosti. I když je tato informace v různých rejstřících státní správy stejná, formát publikování se pro různé rejstříky liší.

Tyto problémy se snaží řešit Open Data Protocol (OData). Zjednodušeně řečeno, je to způsob, jak publikovat obsah databáze, nebo jiných strukturovaných dat, v prostředí internetu za použití existujících standardů. Protokol je postaven na návrhovém vzoru REST (http://cs.wikipedia.org/wiki/Representational_State_Transfer)  a data serializuje podle požadavku klienta do formátu ATOM (http://cs.wikipedia.org/wiki/Atom_(standard)) nebo JSON (http://cs.wikipedia.org/wiki/JSON). Navíc protokol přidává dotazovací jazyk, který sjednocuje způsob vytváření dotazů pro různé datové zdroje. Datový zdroj poskytuje také metadata, které se využívají pro popis datové struktury. Popis protokolu, knihoven a poskytovatelů dat najdete na adrese http://www.odata.org.

Praktická ukázka

Na adrese http://services.odata.org/Northwind/Northwind.svc/ najdete ukázkový datový zdroj. Jak vidíte, k serializaci se používá formát ATOM. Pokud se chcete podívat na strukturu datového zdroje, stačí si požádat o metadata: http://services.odata.org/Northwind/Northwind.svc/$metadata

Pár příkladů:

Seznam kategorií produktů: http://services.odata.org/Northwind/Northwind.svc/Categories

Kategorie s primárním klíčem 1: http://services.odata.org/Northwind/Northwind.svc/Categories(1)

Produkty patřící do kategorie s primárním klíčem 1: http://services.odata.org/Northwind/Northwind.svc/Categories(1)/Products

Produkty začínající písmenem „a“ seřazené podle názvu produktu: http://services.odata.org/Northwind/Northwind.svc/Products?$filter=startswith(ProductName, 'a')&$orderby=ProductName

A tak bychom mohli pokračovat dál.

Abychom se nemuseli zabývat ručním sestavováním dotazů a následným zpracováním odpovědi, můžeme si na základě metadat vytvořit tzv. proxy třídu. Proxy třída představuje obraz datového zdroje na straně klienta a zapouzdřuje komunikaci se serverem. Programátor pak pracuje s lokálními objekty, které proxy třída synchronizuje s daty na serveru. Abychom si mohli nechat vytvořit proxy třídu pro PHP aplikaci budeme potřebovat OData SDK for PHP (http://odataphp.codeplex.com/).

Instalace OData SDK for PHP

1.Povolte rozšíření PHP_XSL a PHP_CURL

2.Obsah adresáře framework z instalačního balíčku nakopírujte do libovolného adresáře, např. C:\php\odata

3.Tento adresář přidejte do include_path v php.ini:

include_path = ".; C:\php\odata"

4.V php.ini vytvořte proměnnou ODataphp_path:

;OData SDK for PHP Library Path

ODataphp_path = "C:\PHPLib\odataphp"

5.Povolte a nastavte proměnnou date.timezone v php.ini

[Date]

;Defines the default timezone used by the date functions

date.timezone = Europe/Prague

Detailní instrukce najdete v adresáři doc v instalačním balíčku.

Vytvoření proxy třídy

Vlastní vytvoření proxy třídy uděláte pomocí skriptu PHPDataSvcUtil.php. Základní syntaxe vyžaduje jen jeden parametr a to koncový bod služby. Pokud využijeme naší vzorovou službu, bude příkaz a výsledek vypadat takto:

c:\Temp>php c:\php\odata\PHPDataSvcUtil.php /uri=http://services.odata.org/Northwind/Northwind.svc/

Done: OData Service Proxy File 'NorthwindEntities.php' generated at .

Vytvořený soubor NorthwindEntities.php musíte zařadit do vašeho projektu.

Práce se zdrojem dat pomocí proxy třídy

<?php

include_once 'NorthwindEntities.php';

$svc = new NorthwindEntities('http://services.odata.org/Northwind/Northwind.svc/');

$query = $svc->Customers()->filter("Country eq 'USA'")

->Select('CustomerID,CompanyName');

$customersResponse = $query->Execute();

foreach($customersResponse->Result as $customer)

{

echo "CustomerID:" . $customer->CustomerID . "\n";

echo "Company Name:" . $customer->CompanyName . "\n";

echo "Country:" . $customer->Country . "\n"; // nic nevypíše, není v Select

echo "----------\n";

}

?>

Jak vidíte s kódu o sestavení dotazů a následné zpracování odpovědí, včetně serializace a deserializace dat se postará proxy třída.

Pomocí protokolu OData můžete data v datovém zdroji samozřejmě i měnit.

Vytvoření nového záznamu

try

{

$cat = Categories::CreateCategories(0, 'Pivo');

$svc->AddToCategories($cat);

$svc->SaveChanges();

echo "CategoryID nového záznamu: " . $cat->CategoryID . "\n";

}

catch (ODataServiceException $e)

{

echo "Chyba:" . $e->getError() . "\nPopis:" . $e->getDetailedError();

}

catch(InvalidOperation $e)

{

echo $e->getError();

}

K vytvoření záznamu potřebujete vytvořit lokální objekt (řádek v tabulce), který následně vložíte do správné kolekce (tabulky). To vše se děje na straně klienta a server o ničem neví. Vlatní uložení se provede metodou SaveChanges, která vyvolá odeslání dat na server. Server po zpracování záznamu pošle odpověď, která obsahuje nově uložený záznam, který již obsahuje všechny automaticky doplňované informace, např. nově přiřazení ID záznamu.

Aktualizace záznamu

$cat->Description = 'To nejlepší pivo';

$svc->UpdateObject($cat);

$svc->SaveChanges();

Změnu provedete opět na straně klienta a pak změny uložíte na server.

Odstranění záznamu

$svc->UpdateObject($cat);

$svc->SaveChanges();

Závěr

Protokol OData se postupně stává de-facto standardem pro všechny serverové aplikace společnosti Microsoft a začíná se využívat i u třetích stran, které potřebují publikovat obsah svých databází v prostředí internetu.

Štěpán Bechynský, Microsoft
Televize pro vývojáře
Vše pro vývojáře

Články ze série Microsoft TechNet nevytváří redakce Živě.cz, ale partneři programu Microsoft TechNet. Jsou publikovány v rámci mediálního partnerství Živě.cz a společnosti Microsoft.

Váš názor Další článek: Google TV naráží na konzervativní pravidla amerických stanic

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,