xmlrpc_encode
(PHP 4 >= 4.0.7, PHP 5)
xmlrpc_encode — Generates XML for a PHP value
Описание
Внимание
Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.
Внимание
К настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов.
- xmlrpc_decode_request
- xmlrpc_decode
- xmlrpc_encode_request
- xmlrpc_encode
- xmlrpc_get_type
- xmlrpc_is_fault
- xmlrpc_parse_method_descriptions
- xmlrpc_server_add_introspection_data
- xmlrpc_server_call_method
- xmlrpc_server_create
- xmlrpc_server_destroy
- xmlrpc_server_register_introspection_callback
- xmlrpc_server_register_method
- xmlrpc_set_type
Коментарии
This function would be used by an XML-RPC server to convert PHP variables into an XML-RPC response.
It would be used within the PHP functions defined using xmlrpc_server_register_method()
Uses PHP variable reflection to assign the correct data types for the XML-RPC response. For example;
<?php
$params = array ( "one"=>"red","two"=>"blue","three"=>"green" );
$response = xmlrpc_encode ( $params );
echo ( $response );
?>
Produces;
<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
<value>
<struct>
<member>
<name>one</name>
<value>
<string>red</string>
</value>
</member>
<member>
<name>two</name>
<value>
<string>blue</string>
</value>
</member>
<member>
<name>three</name>
<value>
<string>green</string>
</value>
</member>
</struct>
</value>
</param>
</params>
While
<?php
$params = array ( "red", "blue", "green" );
$response = xmlrpc_encode ( $params );
echo ( $response );
?>
produces;
<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
<value>
<array>
<data>
<value>
<string>red</string>
</value>
<value>
<string>blue</string>
</value>
<value>
<string>green</string>
</value>
</data>
</array>
</value>
</param>
</params>
And
<?php
$params = 1;
$response = xmlrpc_encode ( $params );
echo ( $response );
?>
produces
<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
<value>
<int>1</int>
</value>
</param>
</params>
It's useful to be aware of the settype() function (http://www.php.net/settype).
For binary base64 data and XML-RPC iso8601 date times the xmlrpc_set_type() function should be used on a PHP variable before using xmlrpc_encode()
Beware this quirk: when you xmlrpc_encode a hash into xmlrpc, numeric keys will not be kept. Even strings containing numbers-only will be lost.
i.e.: xmlrpc_decode(xmlrpc_encode(array('123'=>456)));
returns: array(0=>456);
Apparently this is intentional functionality (see http://bugs.php.net/bug.php?id=21949)
2 workarounds:
1. prepend/append a string (even whitespace) to all keys, and strip them out at the other end. eg array('key_123'=>456);
2. create an array of hashes. array(array('key'=>123,'value'=>456));
I favour the second option because it's more deliberate.
... this also applies to xmlrpc_encode_request()
Another quirk (more of a bug i think) is the automatic encoding of hashes where all keys that begin with a digit between 1 and 9 are lost:
http://bugs.php.net/bug.php?id=37746
Luckily I found a quick workaround. Just append chr(0x00) to your keys and the xmlrpc response will be correct. Maybe this will apply to encoding of hashes for requests too.
Worth noting, you can use this function to generate fault response xml.
If you pass a pre-determined array into this function, as follows
<?
$myArray = array ("faultCode"=>1,"faultString"=>"Too many params");
$xml = xmlrpc_encode($myArray);
?>
... you will get output much like the following:
<?xml version="1.0" encoding="utf-8"?>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value>
<int>4</int>
</value>
</member>
<member>
<name>faultString</name>
<value>
<string>Too many params</string>
</value>
</member>
</struct>
</value>
</fault>
All that is needed to do here to make it valid XML-RPC is inject some of your own methodResponse tags.
Check the XML-RPC specification at http://www.xmlrpc.com/spec
This xmlrpc_encode function doesn't generate the "methodResponse" tag required by some clients.
Using xmlrpc_encode_request seems better:
<?php
$xmlresponse = xmlrpc_encode_request(NULL, $phpresponse);
xmlrpc_encode(1) generate
<?xml version="1.0" encoding="utf-8"?>
<params>
<param>
<value>
<int>1</int>
</value>
</param>
</params>
xmlrpc_encode_request(NULL,1) generate
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<int>1</int>
</value>
</param>
</params>
</methodResponse>
?>
Note: xmlrpc_encode was experimental and is removed in PHP 8+ and should not be used.