API:Implementation Strategy/cs

Vysvětluje implementaci MediaWiki API v jádru. Pokud chcete ve svém kódu poskytnout rozhraní API pro klienty k použití, přečtěte si.



Struktura souboru/modulu

 * je vstupní bod umístěný v kořenovém adresáři wiki. Viz API:Hlavní stránka#Koncový bod.
 * bude obsahovat všechny soubory související s API, ale žádný z nich nebude povolen jako vstupní bod.
 * Všechny třídy API jsou odvozeny od společné abstraktní třídy . Základní třída poskytuje běžné funkce, jako je analýza parametrů, profilování a zpracování chyb.
 * je hlavní třída vytvořená pomocí . Určuje, který modul se má spustit, na základě parametru  .   také vytvoří instanci třídy , která obsahuje pole výstupních dat a související pomocné funkce. Nakonec   vytvoří instanci formátovací třídy, která klientovi vyvede data z   ve formátu XML/JSON/PHP nebo v jiném formátu.
 * Jakýkoli modul odvozený z  obdrží během vytváření instance odkaz na instanci , takže během provádění může modul získat sdílené prostředky, jako je výsledný objekt.



Moduly dotazů

 * se chová podobně jako  v tom, že spouští submoduly. Každý submodul je odvozen od   (kromě samotného , což je modul nejvyšší úrovně). Během vytváření instance obdrží submoduly odkaz na instanci ApiQuery.
 * Všechny moduly dotazů rozšíření by měly používat 3 nebo více písmenných předpon. Základní moduly používají 2 písmenné předpony.
 * Realizační plán :
 * Získejte sdílené parametry dotazu  k určení potřebných submodulů.
 * Vytvořte objekt  a naplňte jej z parametrů  . Objekt   obsahuje seznam stránek nebo revizí, se kterými budou moduly dotazů pracovat.
 * Na požádání se spustí modul generátoru k vytvoření dalšího . Podobné jako piping streams v UNIXu. Dané stránky jsou vstupem do generátoru, který vytváří další sadu stránek pro všechny ostatní moduly, na kterých mohou pracovat.
 * Požadavky na pokračování dotazu:
 * SQL dotaz musí být zcela uspořádaný. Jinými slovy, dotaz musí používat všechny sloupce nějakého jedinečného klíče buď jako konstanty v klauzuli  nebo v klauzuli.
 * V MySQL se jedná o exclusive or až do bodu, kdy se dotazování Foo a Bar musí řadit podle názvu, ale nikoli jmenného prostoru (jmenný prostor je konstantní 0), Foo a Talk:Foo se musí řadit podle jmenného prostoru, ale ne podle názvu (název je konstantní "Foo") a Foo a Talk:Bar se musí řadit podle jmenného prostoru i názvu.
 * The SQL query must not filesort.
 * The value given to  must include all the columns in the   clause.
 * When continuing, a single compound condition should be added to the  clause. If the query has , this condition should look something like this:

(column_0 > value_0 OR (column_0 = value_0 AND&#xa; (column_1 > value_1 OR (column_1 = value_1 AND&#xa; (column_2 >= value_2)&#xa; ))&#xa;))

Of course, swap ">" for "<" if your  columns are using. Be sure to avoid SQL injection in the values.

Internal data structures

 * Query API has had very successful structure of one global nested  structure passed around. Various modules would add pieces of data to many different points of that array, until, finally, it would get rendered for the client by one of the printers (output modules). For the API, we suggest wrapping this array as a class with helper functions to append individual leaf nodes.

Error/status reporting
For now we decided to include error information inside the same structured output as normal result (option #2).

For the result, we may either use the standard HTTP error codes, or always return a properly formatted data:

void header( string reason_phrase [, bool replace [, int http_response_code]] ) The  can be used to set the return status of the operation. We can define all possible values of the, so for the failed login we may return   and  , whereas for any success we would simply return the response without altering the header.
 * Using HTTP code

Pros: It's a standard. The client always has to deal with HTTP errors, so using HTTP code for result would remove any separate error handling the client would have to perform. Since the client may request data in multiple formats, an invalid format parameter would still be properly handled, as it will simply be another http error code.

Cons: ...

This method would always return a properly formatted response object, but the error status/description will be the only values inside that object. This is similar to the way current Query API returns status codes.
 * Include error information inside a proper response

Pros: HTTP error codes are used only for the networking issues, not for the data (logical errors). We do not tied to the existing HTTP error codes.

Cons: If the data format parameter is not properly specified, what is the format of the output data? Application has to parse the object to know of an error (perf?). Error checking code will have to be on both the connection and data parsing levels.