xmlrpc_encode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode_request生成方法请求的 XML

描述

xmlrpc_encode_request(string $method, mixed $params, array $output_options = ?): string
警告

此函数为实验性。此函数的行为、名称和周围文档可能会在 PHP 的未来版本中发生更改,恕不另行通知。使用此函数需自担风险。

参数

method

要调用的方法的名称。

params

与方法签名兼容的方法参数。

output_options

指定输出选项的数组可能包含(默认值以强调显示)

  • output_type: php, xml

  • verbosity: no_white_space, newlines_only, pretty

  • escaping: cdata, non-ascii, non-print, markup(可以是包含一个值的字符串或包含多个值的数组)

  • version: simple, xmlrpc, soap 1.1, auto

  • encoding: iso-8859-1, iconv 支持的其他字符集

返回值

返回一个字符串,其中包含请求的 XML 表示形式。

示例

示例 #1 XMLRPC 客户端函数示例

<?php
$request
= xmlrpc_encode_request("method", array(1, 2, 3));
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request
)));
$file = file_get_contents("http://www.example.com/xmlrpc", false, $context);
$response = xmlrpc_decode($file);
if (
$response && xmlrpc_is_fault($response)) {
trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
print_r($response);
}
?>

参见

添加笔记

用户贡献笔记 9 条笔记

7
kelly at seankelly dot biz
21 年前
二进制字符串(使用 xmlrpc_set_type 设置)将进入一个 <base64>...</base64> 块,就像您预期的那样。但每隔 80 个字符,此函数就会插入 XML 实体 "&#10;",这是一个 Unicode 换行符,好像是为了引起换行,这确实很愚蠢。

尽管它很愚蠢,但它会对某些 XML-RPC 服务器造成实际问题,例如 http://jakarta.apache.org/xmlrpc/(nee Helma)。使用类似以下内容的方法来去除这些实体

$req = preg_replace('/&#10;/', '', xmlrpc_encode_request("my.method", $args));

可以解决这个问题。
3
fredrik at it dot cdon dot com
16 年前
需要注意的是,编码似乎没有对任何东西进行编码,只是指定了进入 XML 头的内容。

当使用此函数时,我们在将双重编码的 UTF 字符串保存到数据库时遇到了问题,将其发送到 apache xml-rpc servlet 并将其存储在 mysql 数据库中。它通过将 'escaping' 设置为 'markup' 和 'encoding' 设置为 'UTF-8' 来解决(不要忘记在 xmlrpc_decode 中也设置 'utf-8')。

似乎 UTF-8 编码的字符串使用其字节作为实体进行转义,而不是使用其字符作为实体进行转义。
2
cometfish at hotmail dot com
15 年前
上面的示例不正确 - 标题需要是一个数组,请参阅“chris dot vigelius at gmx dot net”的帖子:http://au.php.net/manual/en/function.stream-context-create.php#74431
他的帖子还展示了如何进行浏览器身份验证,如下所示
<?php
$request
= xmlrpc_encode_request("methodName", array("methodParam"));
$auth = base64_encode($username.":".$password);
$header = (version_compare(phpversion(), '5.2.8'))
? array(
"Content-Type: text/xml","Authorization: Basic $auth")
:
"Content-Type: text/xml\r\nAuthorization: Basic $auth" ; //[1]
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => $header,
'content' => $request
)));
$webservice="http://www.example.com/rpc";
$file = file_get_contents($webservice, false, $context);
$response = xmlrpc_decode($file);
if (
xmlrpc_is_fault($response)) {
return
"xmlrpc: $response[faultString] ($response[faultCode])";
} else {
return
$response;
}
?>

1 - 编辑器说明:这是来自“SandersWang dt php at gmail dot com”的修正
1
hfuecks at pinkgoblin dot com
21 年前
此函数应由 XML-RPC 客户端使用,以创建 XML-RPC 请求的 XML 负载;

<?php
$params
= "system.methodSignature";
$method = "system.methodHelp";
$request = xmlrpc_encode_request($method,$params);
echo (
$request );
?>

产生;

<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>system.methodHelp</methodName>
<params>
<param>
<value>
<string>system.methodSignature</string>
</value>
</param>
</params>
</methodCall>

第二个参数识别变量类型并生成正确的 XML-RPC 结构。有关更多详细信息,请参阅 xmlrpc_encode()。
1
Anonymous
14 年前
您曾经尝试过使用 xmlrpc 传输以下数组吗?
$var1=array(7=>14,9=>18);

输出数组看起来非常不同!它会看起来像这样
$var2=array(14,18);

我找到的唯一解决方案是在索引前面添加一个空格
$var3=array(' 7'=>14,' 9'=>18);

使用此方法,您将获得正确的结果。($var1)
1
handco at gmail dot com
17 年前
具有函数重载的简单 OO 客户端

PHP 方法 test_helloworld 被转换为 xmlrpc 方法 test.helloworld。

class RpcClient {

private $_methods;
private $_context;
private $_url;

function __construct ($url, $user, $passwd) {
$auth = base64_encode(sprintf('%s:%s', $user,$passwd));
$this->_context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: text/xml\r\n".
"Authorization: Basic $auth" ,

)
));
$this->_url = $url;

$this->registerMethod ("Test_HelloWorld");

}


function __call($methodName, $params) {
if (array_key_exists($methodName,$this->_methods)) {
// 调用 RPC 函数
$m = str_replace('_', '.', $methodName);
$r = xmlrpc_encode_request($m, $params,array('verbosity'=>'newlines_only'));
$c = $this->_context;
stream_context_set_option($c,'http','content',$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
return $resp;
} else {
// 调用对象函数
call_user_method_array($methodName, $this,$params);
}
}

private function registerMethod ($method) {
$this->_methods[$method] = true;
}

}
2
<URL:http://www.dlitz.net/go/contact/>
20 年前
请注意,据我所知,PHP 在 base64 字段中生成的 &#10; 字符似乎根本没有违反 XML-RPC 标准。XML-RPC 消息*是* XML 格式的,因此 XML 实体应该在传递到 base64 解码器之前被解码。因此,之前提到的基于 Jakarta 的 XML-RPC 服务器似乎违反了 XML 规范。即,这里没有需要在 PHP 中“修复”的东西。
1
php at hendrik dash krauss dot de
19 年前
有关数组 output_options 的示例/文档,请参阅 http://xmlrpc-epi.sourceforge.net/main.php?t=php_api#output_options

简而言之,output_options 允许您发送紧凑的 xmlrpc(没有 xmlrpc_encode 通常添加的“漂亮空白”),在发送之前应用自己的转义表,设置编码以及其他一些内容(页面甚至提到了 soap 1.1 ... 我不知道详细信息)。
0
giunta dot gaetano at sea-aeroportimilano dot it
17 年前
请注意,当使用某些参数调用此函数时,它将生成无效的 xmlrpc 内容(该内容将被 lib 本身愉快地解析,但不会被其他实现解析)。

xmlrpc_encode_request(null, null)
将生成没有值的响应

xmlrpc_encode_request('myfunc', array('faultCode' => 666, 'faultString' => 'hello world')
将生成一个请求,其中包含 <fault> 成员,而不是 <params>
To Top