XML-RPC 函数

目录

添加笔记

用户贡献的笔记 19 个笔记

3
astrolox at lawyersonline dot co dot uk
19 年前
SourceForge 上的 PHP XML-RPC 项目让生活变得容易得多。但是,该项目使用了一些与 XML-RPC 扩展提供的函数名称相同的函数名称。

如果您在编译了 XML-RPC 扩展的服务器上,但希望使用基于 PHP 的版本,则需要重命名一些函数。

我注意到 sourceforce 称该项目在 2005 年有活动,但最后一次发布是在 2003 年 1 月 12 日。

我建议您使用这个不太友好的 PHP 扩展(如果可用)。但是,如果您无法控制服务器上提供哪些扩展,那么 sourceforce 项目仍然是一个好主意。

http://phpxmlrpc.sourceforge.net/
3
swunderlin at REMOVE-telemedia dot ch
20 年前
如果您无法重新编译 php,pear hs 有一个 XML_RPC 包
http://pear.php.net/package/XML_RPC
3
steve at orangeNOSPAMimagineering dot com
21 年前
Keith Devens(版本 2.2.1)在以下位置提供了一个方便的库
http://www.keithdevens.com/software/xmlrpc/

这是一个示例客户端。它远程调用 sample.sumAndDifference
带有两个参数(3 和 5)。
它返回

sum => 8
difference => -2

<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0); // 设置为 1 以便于调试

$method = "sample.sumAndDifference";
$params = XMLRPC_prepare(array(3,5));

$site = "xmlrpc-c.sourceforge.net";
$location = "/api/sample.php";

list(
$success, $result) = XMLRPC_request( $site, $location, $method, $params );

// XMLRPC_debug_print(); // 取消注释以进行调试

foreach ( $result as $key => $value ) {
echo(
" $key => $value \n");
}

?>
10
martin dot rode at programmfabrik dot de
19 年前
要连接到 python xmlrpc 服务器,我使用

function do_call($host, $port, $request) {

$url = "http://$host:$port/";
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($request);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

$data = curl_exec($ch);
if (curl_errno($ch)) {
print curl_error($ch);
} else {
curl_close($ch);
return $data;
}
}

$request = xmlrpc_encode_request('add', array(3, 4));
$response = do_call($host, $port, $request);
3
keithNO dot SPAMthornhill at gmail dot com
18 年前
对于尝试相同操作的其他人,如果您想从客户端发送 base64 编码的文件,然后将其保存在服务器上,那么函数将如下所示。通过 RPC 调用此函数所需的其余代码在其他注释中提供,因此我不会重复它。

参数
1 - 文件名
2 - 文件的 base64 编码数据

注意 $file_data->scalar 的使用

<?
function sendFile($method_name, $params, $user_data) {
$file = "/somedir/" . $params[0];
$file_data = $params[1];

$fh = @fopen($file, "wb");
if ($fh) {
if (@fwrite($fh, $file_data->scalar)) {
$msg = "成功消息";
} else {
$msg = "无法写入文件";
}
fclose($fh);
return $msg;
} else {
return "无法打开文件";
}
}
?>
2
php at hendrik-krauss dot de
20 年前
关于“日期时间”值

如果您使用这些函数实现一个 XML-RPC 服务器,并且客户端在您的服务器上调用一个方法,发送一个日期时间作为参数(以 ISO 8601 格式,如 http://www.xmlrpc.com/spec 中所述),则 PHP XML-RPC 将向您注册的服务器方法传递一个对象作为参数。例如,该对象如下所示
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760

如果您执行 xmlrpc_get_type(obj),它将返回“datetime”,因此该函数可能只返回“type”的值。'scalar' 似乎是日期时间的线路上表示(ISO 8601,与接收到的完全相同)。'timestamp' 似乎是 'scalar' 中的 ISO 值转换为正常的 PHP 时间戳(即 Unix time_t)。

关于 'scalar' 的说明:使用 MySQL 数据库时,我们做了类似“select blah where start_time >= $obj->scalar ;”的操作。这实际上有效并返回了预期的结果,因此 MySQL 似乎正确处理了 ISO 8601 格式。
1
digibrisk at gmail dot NOSPAM dot SPAMNO dot com
16 年前
补充一下 giunta dot gaetano at sea-aeroportimilano dot it 和 astrolox at lawyersonline dot co dot uk 关于 Sourceforge PHP XML-RPC 项目的说明:您可以使用 function_exists() 来确定扩展是否已安装,这样您就不必承担性能成本。如果未安装,则该函数不存在,function_exists() 返回 false。在这种情况下,您可以回退到备用库。例如

<?php

if(!function_exists("xmlrpc_server_create")) {
// 包含必要的文件。
}

?>
3
steph at zend dot com
20 年前
我花了一段时间才在没有外部库的情况下组装一个客户端。这组非常基本的客户端/服务器对在我的家庭设置中有效 - 希望它能为下一个 xml-rpc 新手省去一些麻烦。

/* clienttest.php */
<?php
function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);
$query = "POST /home/servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!
fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return
0;
}

$contents = '';
while (!
feof($fp)) {
$contents .= fgets($fp);
}

fclose($fp);
return
$contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
switch($params[0]) {
case
'egg':
$reply = 'All eggs will be birds one day.';
break;
default:
$reply = 'That must have been an otheregg';
}
return
$reply;
}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print
$response;

xmlrpc_server_destroy($server);
?>
1
bmichael at goldparrot dot com
21 年前
如果您有兴趣直接从客户端发出 XMLRPC 请求,我已经能够让 xmlrpc 与
vcXMLRPC javascript 后端一起工作。

在大约一周的市场扫描之后,我发现这种解决方案是 Javascript 后端最好的解决方案。它使用 Microsoft.HTTP activeX 控件(用于 IE)或 HTTPRequest 对象(用于 Mozilla)。

您将 vc(Virtual Cowboys) vcXMLRPC.js 文件包含在您的页面中,并使用 Javascript 从中发出 rpc 调用以创建请求。

它双向工作。

两点说明

我在 IE 6.02 上测试过,您需要更改 ProcessRequest 中的代码行
函数以读取

dom = this.getObject("XMLDOM",http.responseText);

并将 getObject 函数更改为使用最新的 ActiveX 控件

MSXML2.XMLHTTP.3.0(或 4.0)
MSXML2.DOMDocument.3.0(或 4.0)

这些控件可以在 MSDN 的 Web 服务 -> XML 部分找到。

另外要注意的是,您不需要使用 rpcproxy.cgi 脚本。这是一个代理脚本,用于绕过 JS 安全限制。您可以使用 PHP 构建代理。但是,我能够让 CGI 与 Solaris 上的 GCC 编译器一起工作(在 Makefile 中更改 -KPCI、depend 和 -x03 优化器设置)。
2
Anonymous
18 年前
此 XML-RPC 服务使使用 XML-RPC 变得非常容易。

<?php

/**
* function myfun() returns
*@return array
*/
function myfunc(){
return
$some_array;
}

$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();

?>

http://www.pure-php.de/node/31

它还创建了一个简单的文档。
http://www.pure-php.com/php/service.php?doc
2
giunta dot gaetano at sea-aeroportimilano dot it
17 年前
如果您需要使用此扩展但卡在了无法安装它的服务器上,那么可以在 http://phpxmlrpc.sourceforge.net 找到的 php-xmlrpc 库包含一个模拟层,旨在与原生扩展的 API 100% 兼容(作为“extras”包的一部分,自版本 0.2 以来)。
这意味着您的代码应该能够在 php-xmlrpc 库之上无修改地运行。当然,性能至少会下降一个数量级……
1
handco at gmail dot com
17 年前
您好,

一个小片段来实现面向对象的 XML RPC 服务器。

文件 RPCPlugin.php

class RPCPlugins {

private $plugins;

function __construct ($pathname, $rpcServer) {
$d = dir($pathname);
while (($file = $d->read()) !== false) {
if (ereg('(.*)\.php$', $file, $regs)) {
include_once ($pathname . '/' . $file);
$class=$regs[1];
$this->plugins = new $class($rpcServer);
}
}
}

}

class RPCPlugin {

private $_rpcServer;

function __construct($rpcServer) {
$this->_rpcServer = $rpcServer;

$methods = get_class_methods($this);

foreach ($methods as $method) {
if (substr($method, 0,1) != '_') {
xmlrpc_server_register_method($rpcServer,get_class($this) . "." . $method,array(&$this,$method));
}
}

}

}

插件的示例,在 plugins/Test.php 中

class Test extends RPCPlugin {


function HelloWorld ($method, $params) {
return "Hello World --->>" . $params[0];
}

}

现在是真正的服务器

require_once 'RPCPlugin.php';

$rpcServer = xmlrpc_server_create();

$plugins = new RPCPlugins(realpath('plugins/'), $rpcServer);

$resp = xmlrpc_server_call_method($rpcServer,$HTTP_RAW_POST_DATA,null);
if ($resp) {
header ('Content-Type: text/xml');
echo $resp;
}
xmlrpc_server_destroy($rpcServer)

然后,您可以通过类名.方法调用方法。
对于这个示例 Test.HelloWorld

Hn'Co
1
john # curioussymbols com
18 年前
我无法让 'xmlrpc_errors' php.ini 设置生效
明显(PHP 4.3.11),所以我使用了以下代码来报告错误
来自我的 XMLRPC 服务器。希望对某人有所帮助。

<?php
function return_xmlrpc_error($errno,$errstr,$errfile=NULL,$errline=NULL
,$errcontext=NULL){
global
$xmlrpc_server;
if(!
$xmlrpc_server)die("Error: $errstr in '$errfile', line '$errline'");

header("Content-type: text/xml; charset=UTF-8");
print(
xmlrpc_encode(array(
'faultCode'=>$errno
,'faultString'=>"Remote XMLRPC Error from
"
.$_SERVER['HTTP_HOST'].": $errstr in at $errfile:$errline"
)));
die();
}
set_error_handler('return_xmlrpc_error');
?>

在我的服务器函数中,我只触发 trigger_error("message",E_USER_ERROR)]
如果某些操作无法完成。

然后在客户端,
<?php
$data
=& xmlrpc_decode($response['body']);

if(
xmlrpc_is_fault($data)){
trigger_error($data['faultString'],E_USER_ERROR);
}
?>
1
Jerome Delamarche
19 年前
文档中缺少一个示例,该示例显示如何发送故障作为响应。以下是执行此操作的方法

$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
2
hfuecks at pinkgoblin dot com
21 年前
此扩展不处理通过 HTTP 发出 XML-RPC 客户端请求的过程;它只准备 XML-RPC 请求负载。

这与许多其他 XML-RPC 实现不同,但提供了更大的灵活性,允许 SSL 连接、身份验证标头以及通过 SMTP 等其他传输方式进行 XML-RPC。
2
nic at uklinux dot NOSPAM dot net
22 年前
可以在 http://xmlrpc.usefulinc.com 获取另一种 XML-RPC 实现 - 它用 PHP 编写,因此您可以在没有重新构建 PHP 的服务器上使用它。

nic
0
mboeren at php dot net
20 年前
我对之前的 xmlrpc_client 类进行了一些快速添加:由于您不能使用包含大写字母的远程方法或来自子处理程序的方法(如 'system.listMethods()'),我在该类中添加了一个 'call(...)' 方法。

<?php
// 此方法应复制/粘贴到
// xmlrpc_client 类中

function call($function)
{
$return = NULL;
$argv = func_get_args();
array_shift($argv); // 删除函数参数
$this->__call($function, $argv, &$return);
return
$return;
}

// 现在,您也可以执行以下操作
$result = $client->call('system.listMethods');
$sum = client->call('add', '1', '2');
?>
-2
mboeren at php dot net
20 年前
我使用以下代码(需要 overload 扩展)来简化客户端开发

<?php
include("utils/utils.php"); // 来自 xmlrpc-epi utils

/*
用法:
$client = new xmlrpc_client("http://localhost:7080");
print $client->echo('x')."\n";
print $client->add(1, 3)."\n";

*/
class xmlrpc_client
{
var
$url;
var
$urlparts;

function
xmlrpc_client($url)
{
$this->url = $url;
$this->urlparts = parse_url($this->url);
foreach(array(
'scheme', 'host', 'user', 'pass', 'path',
'query', 'fragment')
as
$part) {
if (!isset(
$this->urlparts[$part])) {
$this->urlparts[$part] = NULL;
}
}
}

function
__call($function, $arguments, &$return)
{
$requestprms['host'] = $this->urlparts['host'];
$requestprms['port'] = $this->urlparts['port'];
$requestprms['uri'] = $this->urlparts['path'];
$requestprms['method'] = $function;
$requestprms['args'] = $arguments;
$requestprms['debug'] = 0;
$requestprms['timeout'] = 0;
$requestprms['user'] = NULL;
$requestprms['pass'] = NULL;
$requestprms['secure'] = 0;

$result = xu_rpc_http_concise($requestprms);
if (
is_array($result) && isset($result['faultCode'])) {
print(
'Error in xmlrpc call \''.$function.'\''."\n");
print(
' code : '.$result['faultCode']."\n");
print(
' message: '.$result['faultString']."\n");
return
false;
}
$return = $result;
return
true;
}

}
overload('xmlrpc_client');

?>
-5
ivanr at webkreator dot com
22 年前
要使用此 XML-RPC 扩展的一种非常简单的方法,请查看

XML-RPC 类服务器 (http://www.webkreator.com/php/xcs/)

它会自动从 PHP 类创建服务器。创建客户端几乎同样容易,尤其是在 PHP 最近添加了 overload 扩展后(请参阅 https://php.net/manual/en/ref.overload.php)。
To Top