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 654×

„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

Obrázek ke článku RAD Studio a Windows Store

RAD Studio a Windows Store

RAD Studio je první vývojové prostředí se zabudovanou podporou balení aplikací typu Win32 a Win64 pro jejich umístění a šíření prostřednictvím Windows 10 Store.

Reklama
Reklama
Obrázek ke článku Testujte na 2 400+ Android a iOS zařízení

Testujte na 2 400+ Android a iOS zařízení

V dnešní době, kdy většina softwaru pro mobilní aplikace je tvořena a distribuována průběžně, mnohdy do celého světa je třeba zajistit také průběžnou automatizaci testování mobilního softwaru. V případě mobilních aplikací pro Android a iOS začíná být problém, jak testovat na obrovském množství kombinací HW variant, rozměrů, edic operačních systémů různých výrobců v různých částech světa na reálných zařízení. Simulátory a emulátory nejsou většinou to pravé. Pokud již testuji, jak si udělat vlastní beta distribuci opravdovým reálným testerům napříč platformami?

Obrázek ke článku Funkcie main vo Windows API

Funkcie main vo Windows API

V tretej časti seriálu o Windows API budeme hovoriť o funkčných prototypoch main. Funkčný prototyp je tvorený názvom funkcie a typom signatúry, pričom sa vynecháva telo funkcie. 

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ý