PHP a XML-RPC
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

PHP a XML-RPCPHP a XML-RPC

 

PHP a XML-RPC

Google       Google       2. 1. 2011       18 870×

„To XML-RPC je stará technologie, určitě najdu v PHP spoustu tříd, addonů, extenzí a kvalitního kódu.“ Opak je bohužel pravdou, pro XML-RPC mnoho dokumentace a kvalitního kódu není. Pojďme si ukázat, co vlastně se dá používat a jak obejít bugy a „vlastnosti“.

Reklama
Reklama

Výběr toho, co použijete, závisí na vaší verzi PHP a na tom, co „chcete“. Pokud používáte PHP4 style, či nějaké starší verze 5.x, asi se uchýlíte k http://phpxmlrpc.sourceforge.net/. Pokud ovšem používáte PHP 5.2, zvolíte ne tolik zabugovanou interní XML-RPC extenzi http://cz.php.net/xmlrpc, no a v PHP 5.3 třeba zamíříte k jeho nástavbě od Jyxo: https://github.com/jyxo/php/tree/master/Jyxo/Rpc.

Ani jedno ideální

Rozebírat starou knihovnu asi nemá cenu, sice existuje novější beta verze, která podporuje 5.2, ale žádný vývoj se tu neděje, výkonnostně taky žádný zázrak.

Dokumentace extenze PHP je zase pro změnu žalostná. Příklady loudíte spíše z komentářů. Nicméně to je taky „zdroj“, a tak za chvíli vyloudíte něco, co snad funguje. Pokud zůstanete, po nějaké době narazíte na první problém – diakritika a kódování. Ideální je se posunout k nějaké nadstavbě, třeba knihovně od Jyxa.

Otázka je, jestli si chcete do projektu mermomocí zatahovat jmenné prostory + ještě nějaké další profilovací knihovny od Jyxo. Tady klidně vymýšlejte kolo znovu, protože těch dobrých ještě moc vytvořeno nebylo.

Diakritika

Vyřešit problémy s diakritikou se dá velmi jednoduše. Při tvorbě XML-RPC requestu musíte vypnout escapování, a to tak, že jej nastavíte jenom pro „markup“.

$options = array(
	'output_type' => 'xml',
	'verbosity' => 'pretty',
	'escaping' => array('markup'),
	'version' => 'xmlrpc',
	'encoding' => 'utf-8'
);
xmlrpc_encode_request($method, $params, $options);

Nezapomeňte také encoding nastavit na UTF-8 a v tomto kódování data podávat. Ať už byste nastavili encoding jakkoliv, jedná se pouze o hodnotu, která bude v XML hlavičce, extenze ji při escapování kódování nijak nezohledňuje, a proto bylo třeba escapování vypnout.

Klíče

Nyní si ukážeme trochu složitější problém, který je vlastností PHP. Pokud v PHP do pole uložíte data s číselným klíčem předaným jako string, PHP převede klíč na integer:

$var = array();
$var['123'] = 'A';
$var[123]   = 'B';
echo $var['123'];   // vypise B

Tuto vlastnost jste možná ještě ani nezpozorovali, neboť nelineární číselné klíče se často nepoužívají kombinovaně s těmi stringovými. Problém ale nastane v XML-RPC, to totiž (stejně jako např. JavaScript) rozeznává pole a strukturu. Pole má lineární číselné klíče, kdežto struktura může mít za klíč třeba i řetězec.

Jak ale XML-RPC  extenzi říct, že pole není pole, ale struktura, když už samo PHP nám „zmrší klíče“. Existuje na to jednoduchý hack. Abychom zajistili, že PHP klíče nepřekonvertuje na integer, připojíme k nim hodnotu "\00". Klíče tak zůstanou stringy. XML-RPC extenze je pak správně konvertuje na strukturu a znak \00 zahodí.

Zbývá pak už vyřešit jediný problém, jak přidat tento znak automaticky a jen tehdy, kdy je třeba, tedy do pole, které nemá lineární číselné klíče. Toto pole detekujeme také snadno: vezmeme jeho klíče jako hodnoty a porovnáme je s hodnotami nově vytvořeného pole, kde budou hodnoty o stejném rozsahu (nagenerujeme je funkcí range). Pokud se hodnoty shodují, klíče původního pole byly také lineární.

function fixXmlrpcArgs($array)
{
	if (!is_array($array))
		return $array;

	$new = array();
	$range = range(0, count($array) - 1);
	if (array_keys($array) == $range) { # just array
		foreach ($array as $val)
			$new[] = fixXmlrpcArgs($val);

	} else { # structure
		foreach ($array as $key => $val)
			$new[$key. chr(0x00)] = fixXmlrpcArgs($val);

	}

	return $new;
}

Závěrem

Tento druhý fix můžete s radostí používat a šířit. Zájemce nechť klidně vytvoří na Githubu pull request pro Jyxo.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Jan ŠkrášekHonza pracuje jako webdeveloper, věnuje se vývoji Nette\Database a Nextras komponentám. Mnoho času věnuje komunitnímu portálu signály.cz. Honza je taky fanouškem XML technologií.
Web     Twitter    

Nové články

Reklama
Reklama
Obrázek ke článku Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

Obrázek ke článku České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace (CRA) pořádají druhý ročník CRA IoT Hackathonů. Zájemci z řad vývojářů a fanoušků moderních technologií mohou změřit své síly a během jediného dne sestrojit co nejzajímavější funkční prototyp zařízení, které bude komunikovat prostřednictvím sítě LoRa. CRA IoT Hackathony se letos uskuteční ve dvou fázích, na jaře a na podzim, v různých městech České republiky. Jarní běh se odstartuje 31. března v Brně a 7. dubna v Praze.

Obrázek ke článku Cloud computing je využíván stále intenzivněji

Cloud computing je využíván stále intenzivněji

Využívání cloud computingu nabývá na intenzitě. Jen v letošním roce vzroste podle analytiků trh se službami veřejného cloudu o 18 %, přičemž o téměř 37 % vzrostou služby typu IaaS. Růst o více než pětinu pak čeká služby poskytování softwaru formou služby, tedy SaaS. Aktuálním trendům v oblasti využívání cloudu se bude věnovat konference Cloud computing v praxi, která se koná 23. března. 2017 v pražském Kongresovém centru Vavruška na Karlově náměstí 5.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý