API a PHP, díl čtvrtý

a poslední.

Vzhledem k minimálnímu zájmu jsem se rozhodl, že tento díl bude poslední, a proto jej pojmu stručně až heslovitě.

API Licence Key

Pokud chcete mít kontrolu nad tím kdo a jak vaše API využívá, použijte tuto techniku. Každý, kdo bude chtít na API vaší aplikace přistupovat, od vás po registraci získá API Licence Key. Pokud je klient webovou aplikací, můžete svázat konkrétní licenční klíč s IP adresou serveru, na kterém aplikace poběží. Při žádosti klienta o přístup k API (nebo při žádosti o ticket) zkontrolujte licenční klíč a ověřte, zda má klient právo přistupovat a zda má právo přistupovat z té adresy ze které přistupuje.

"Hezká URL" bez šachování s .htaccess

Pro přístup pomocí "hezkých URL" (např. v REST) typu "http://server.cz/api/post/create" se nejčastěji používá mod_rewrite modul pro Apache a nastavení, která vnitřně přesměrují podobné přístupy na nějakou "nehezkou" adresu, třeba "http://server.cz/api/api.php?object=post&action=create".

Existují i dvě méně čistá řešení, bez mod_rewrite:

Máte-li možnost spouštět skript na obsluhu chyby 404 (dejme tomu 404.php), pak můžete nechat adresář /api/ prázdný a veškeré volání odchytávat ve skriptu na zpracování chyby. Podstatné prvky pak jsou:

$path=explode('/',$_SERVER['REQUEST_URI']);
//rozseká řetězec s požadovanou cestou do pole path
array_shift($path);
//protože REQUEST_URI začíná lomítkem, je $path[0] prázdný řetězec. Zahodím ho.
$first=array_shift($path);
//v proměnné first mám teď první prvek požadované cesty. Je-li roven "api", mohu pokračovat a zjistit, co vlastně uživatel chce.
if ($first=='api') {
//v tuto chvíli mám v $path[0] první prvek cesty za API, např. ono "post", v $path[1] mám prvek druhý ("create").
//je to ideální např. pro implementaci takového API, které v URL předává dvojice "předmět / akce", tedy např. /picture/delete.  
....
}


Pokud bylo volání rozpoznáno jako správné, nesmím zapomenout na

header('HTTP/1.1 200 OK');

čímž zajistím, aby skript 404.php nevracel chybový kód, ale aby tvrdil, že vše bylo OK.

Podobnou techniku lze použít i pro REST přístup k objektům, tedy pro přístup typu "http://server.cz/api/prispevky/42".

Takto pracuje např. moje homepage na www.maly.cz – celá je obsluhována skriptem 404.php, žádné adresáře /el, /knihy, /zapisky apod. neexistují, i když se tak URL tváří. Stejně je obsluhován i redirekt domén na Bloguje.

Druhé řešení je podobné tomu prvnímu a lze ho použít ve chvíli, kdy z nějakého důvodu nelze využít skript 404. V kořenovém adresáři (lze i jinde) si vytvořím soubor api.php, který bude volán trošku "podivným" URL ve tvaru "http://server.cz/api.php/user/login". Bude to fungovat jen na kombinaci PHP/Apache a dost možná je nějaké nastavení, které takové chování ruší, ale zatím všude, kde jsem to zkoušel, to fungovalo. Princip je ten, že Apache  takový požadavek předá skriptu "api.php" a to, co je za tím ("/user/login") předá onomu skriptu v $_SERVER['PATH_INFO']. (Takto je obsluhován referenční seznam značek na Bloguje.)

Vůbec pro jakékoli zajímavější tvoření skriptů je globální pole $_SERVER neocenitelný zdroj radosti a poučení a doporučuju si s ním trošku pohrát.

JSON

JavaScript Object Notation. Na rozdíl od univerzálního XML, které je tak mocné, až je otravné, je JSON "odlehčený" formát předávání dat. Výhoda je především v jeho jednoduchosti a rychlosti zpracování. Ideální je pro různé AJAX aplikace. Proč? Protože data předaná ve formátu JSON vypadají nějak takto:

{
    "jmeno": "Pepa Zdepa",
    "mail": "trhni@si.cz",
    "adresa": {
        "mesto": "Brno",
        "psc": 60200,
        "ulice": "Novákova"
    },
    "url": [
        "http://pepa.cz",
        "http://www.zdepa.cz"
    ]
}



"Parsování" takových dat pak probíhá v JavaScriptu prostým příkazem

var clovek = eval("(" + JSON_data + ")");

Existují JSON knihovny pro různé jazyky – viz http://www.json.org/index.html. Výhody pro webové aplikace jsou zřejmé a JSON ocení každý, kdo považuje parsování XML či procházení DOM stromu XML dokumentu kvůli předání několika hodnot za čirý masochismus.

--- 

Tímto končím svůj (mini)seriál na téma "úvod do problematiky API webových aplikací", děkuji za pozornost a všem přeji "happy coding".

Dne 15.02.2007

Twittni

Přidej do: asdf.sk StumbleUpon Toolbar Stumble It!

Komentáře

[1] Minimalni zajem (Almad - WWW) 15.02.2007, 13:48:51 [X] [D]
Rek bych, ze kdo se o web trochu zajima tak api zvlada a "script kiddies" zas uz nezajima tohle ;)

[2] (Gringo - Mail ) 15.02.2007, 13:50:40 [X] [D]
Minimální zájem? Vždyť já skoro nespím, jak se těším na další díl... Nevěřím.

[3] (Arthur Dent ) 15.02.2007, 13:53:08 [X] [D]
[1] Stručně řečeno: Nesouhlasím. Pokud bych souhlasil, tak připustím, že v ČR jsou všichni autoři webových aplikací script kiddies.

[4] PATH_INFO (Martiner ) 15.02.2007, 14:37:27 [X] [D]
PATH_INFO funguje nejen v PHP, ale i v CGI, Java Servletech,...

[5] (zirafka - Mail - WWW) 15.02.2007, 15:37:16 [X] [D]
mrzi me, ze se serial nesetkal s nejakym vetsim zajmem. otazka je, cim je to zpusobene. nevim, jestli ma Arthur zajem o hledani odpovedi na tuto otazku, ale zkusim napsat svuj nazor (snad me kdyztak omlouva to, ze jsem z brna (-;)

1, jak se pozna, ze je ci neni o clanek zajem? podle mnozstvi komentaru? nebo treba podle toho, ze casem opravdu vzroste pocet 2.0 API u nas? To ale neni hned. (Viz RFC 1925 §2) (-;

2, ke clanku se nedostali lidi, ktere by to zajimalo. tzn. na tomto blogu je to prvni ciste odborna serie clanku o programovani, takze mozna zustala zatim neobjevena presto, ze AD je jiste hodne cteny autor

2a, na serial je malo odkazovano tam, kde by nekdo mohl hledat odborne clanky. Mrzi me, ze se clanky nedostali na Weblogy.cz (rikala jsem klukum, ale zustala jsem s protlacovanim taky jen na pul cesty, takze taky moje chyba...)

2b, Skutecne netusim, co si ctou PHP programatori v Cechach. Mozna jen Vranu. Mozna Interval a Roota... Fakt netusim. Ale nikde nebyl tenhle AFAIK
odkazovanej...

4, (se pustim na hodne tenky led) Tipla bych si, ze dost lidi, se boji u Tvych clanku komentovat... Prece jen, snazit se bavit s misantropam neni pro kazdeho... ja jsem to zkusila jednou a celkem me to vycerpalo... (-:

Abys mel aspon jeden opravdu zivej dukaz zajmu: Me ty clanky nadchli. Kdyz jsem si ty clanky precetla a premyslela o tom, napadlo me nekolik zajimavych projektu, ktere bych chtela realizovat a byli by pristupne jen pres API. Chtela jsem ti puvodne napsat, jestli bych mohla s Tebou treba o tech napadech i pokecat, ale pak jsem to z duvodu 4. radsi odlozila na neurcito.

Takze podle me tyhle clanky sice treba neprinesli neco uplne noveho, ale aspon me otevreli novy pohled na vec. Novy pohled na to, jak se k te silene veci zvane web2.0 postavit kreativne. Jenomze tohle ti asi nikdo nerekne, protoze pro uplne nezkuseny programatory to fakt neni a ti zkusenejsi se treba taky inspiruji, ale stydi se, ze na to neprisli sami. (-:

Nebo je to mozna uplne jinak... kazdopadne... ja mam o pokracovani serialu velkej zajem. kolik se teda musi prodat listku, aby se promitalo? (-;

[6] (Yxen ) 15.02.2007, 15:41:09 [X] [D]
Podle čeho soudíš na minimální zájem? Malý počet komentářů přeci pouze nezvratně ukazuje, že ke tvému jedinečnému textu již není co dodat!

Ne každý se o to, co je pod kapotou webu natolik aktivně zajímá, aby věděl tyhle detaily. Jo, někde si to zdarma u kafe přečíst, to je ale jiná. Takže jen piš, barde!

[7] (Lokutus - WWW) 15.02.2007, 15:52:31 [X] [D]
[5] Anebo právě nikdo aktuálně neřeší API, ale až k tomu jednou dojde, bude každý vědět, kde ty články najde. :-)

[8] (pixy ) 15.02.2007, 15:58:32 [X] [D]
ad minimální zájem: pozorně sleduji, s velkým zájmem čtu, leč nekomentuji, nemámť, co bych dodal. Aby sis nemyslel.

[9] (pixy ) 15.02.2007, 16:18:37 [X] [D]
[5] BTW, já jsem rovněž nadšen, jenže jsem taky z Brna, takže to se nejspíš nepočítá.

Ad JSON - tohle řešení je dobré, pokud chceš předat jen nějaká "malá" data, třeba jeden singulární objekt. Má-li toho být ale víc, začnou za chvilku definice těch objektových hodnot tvořit většinu datového objemu. XML je ještě ukecanější a komu se chce parsovat (nemluvě o tom, že parsování XML může být výkonově a paměťově docela problém, zvlášť v IE). Já to třeba řeším předáváním pole dohodnuté struktury, které se jednoduše rekurzivní funkcí rozparsuje a ty názvy se přiřadí až na klientu. Uvedený příklad by pak vypadal např. nějak takhle:

// tohle je definice dat napevno v aplikaci:
var Data_def['API_data'] = [ "jmeno", "mail", ["adresa","ADDR_data"], ["urls","Array"] ];

// tohle pak předává server klientu:
D = ["Pepa Zdepa", "trhni@si.cz", ["Brno",60200,"Novákova"], ["http://pepa.cz", "http://www.zdepa.cz"] ]

// a tohle se na to zavolá (pochopitelně lze sloučit rovnou s předchozím krokem):
parseData( D, "API_data" );

[10] (Čelo ) 15.02.2007, 16:29:01 [X] [D]
Čtu, články chválím a nemám potřeby komentovat (kromě tohoto).

[11] Re: Zajem. Zn. Minimalni (Solvina - Mail ) 15.02.2007, 16:32:41 [X] [D]
Skoda, me se ten serial libil. Po dlouhy dobe si patlam zase neco v PHP a tohle se mi bude hodit. Protoze to chci udelat superluxusne :-). No, aspon mam vychozi bod, kde za minimum penez dostanu neco muziky ;-).

PS. Vis, Arture, ono je tezky te chvalit. Taky bysme se mohli dockat clanku "Jsem tak znuden vasima pochvalama (sic) asi prestanu blogovat". A to by sme (sic), neřádi, byli neradi.

[12] (dgx - Mail - WWW) 15.02.2007, 16:43:49 [X] [D]
> Bude to fungovat jen na kombinaci PHP/Apache a dost možná je nějaké nastavení...

Ano, to nastavení se jmenuje AcceptPathInfo - http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo

[13] (Arthur Dent ) 15.02.2007, 16:45:17 [X] [D]
[11] Netřeba chválit, to se zase, když na to přijde, pochválím sám. Ocením spíš komentáře jako je ten [9] Pixyho, ktere neco pridavaji, rozvadeji myslenku ci polemizuji (viz diskuse se Zirafkou).

[9] Ano, samosebou je to tvoje rychlejsi, ja, kdyz na to prijde, to ani do tech zavorek neuzaviram a posilam to "co polozka to radek". O JSON jsem se zminil hlavne proto, ze zacina byt docela hojne pouzivane a ze je "skoro idealni" pro parsovani v JS (je to zapis objektu v JS, co uz by bylo jednodussi?)

[14] (Arthur Dent ) 15.02.2007, 16:46:02 [X] [D]
[12] Ano, to je to nastaveni! Nemohl jsem si vzpomenout, diky, doplnim do clanku

[15] (rybicka ) 15.02.2007, 22:24:51 [X] [D]
urcite pokracovat, nikdo nevi vsechno, takze i ti znalejsi se dozvi neco noveho:).
mne treba potesila zminka o JSON - neznam, normalne pouzivam taky styl "co polozka to radek", ale tohle si primo rika o pouziti spolu s AJAXem:)

[16] JSON (ah01 - WWW) 16.02.2007, 00:27:22 [X] [D]
[15] JSON se ve spojení s AJAXem běžně používá (ale jestli by se pak nemělo mluvit spíše o AJAJ :-). Problém nastává, když se chceme připojit pomocí XmlHttpRequset k jiné doméně, což u použití cizích API potřebujeme. Proto jsem chtěl zmínit jednu metodu, kterou některá API nabízejí (aspoň je to vidět u Googlu, Yahoo, Del.icio.us a mnoho dalších)

Je to předání JSON dat jako parametr „callback“ funkce. Takže výsledek volání API je takovýto výstup:

zpracuj_data({ … nějaká JSON data … });

Takovéto API (myslím tím REST adresu) se pak dynamicky vloží do stránky jako klasický JS . V okamžiku, kdy dojde k jeho načtení, se skript začne vykonávat a dojde k zavolání fce. „zpracuj_data“, přičemž jako parametr dostane právě JSON data. Google tento postup nazývá json-in-script, viz http://code.google.com/apis/gdata/json.html . Obdobný postup používá hodně různých JS doplňku do stránek (např. Googole Reader). Myslím, že pokud API podporuje JSON, měla by taky umožnit použít i callback funkci. Vzhledem k tomu, kolik služeb tuto možnost nabízí, mohlo by se již jednat o jakýsi standard.

[17] zájem a záujem (tiso - Mail - WWW) 17.02.2007, 19:43:08 [X] [D]
Sorry, že sa pridám medzi tých čo rozoberajú toto, iste to nebolo cieľom tej vety v úvode, ale nebude problém v tom že málo ľudí o tomto vôbec niečo vie? A tak väčšina iba číta, snaží s pochopiť o čom API je a len málo z tých čo o tom niečo vedia má faktické pripomienky?
Čo sa týka článku, tak dík za tretí spôsob spracovania adresy pre hezký url, niekedy to určite využijem...