PHP中XML-RPC使用详解
XML-RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
按照“数据即程序”的观点来看,RPC无非是借助一些通信手段来互相传递数据(信息),所也她也是“高”层次的通信手段,无非是这种通信手段看起来更像是“过程的调用”,因为她往往以一个“函数”的面目示人,从而掩盖了她交换信息的实质。
在各种RPC技术中,我想应该以Sun的RPC最为著名,比较流行的网络文件系统NFS就是建立在SUN RPC技术基础之上的。
XMLRPC,顾名思义(我总是喜欢这样把问题简单化,因为一个比较好的名字往往能概括出一个东西的本质,如果某个名字让你摸不着头脑,我推荐你放弃它,因为那个发明这个东西的人都不知道它的实质,所以你也就没有必要在其上浪费无谓的时间和精力。)就是应用了XML技术的RPC。那么什么是XML了?
XML和RPC一样也是一个东西的缩写,这个东西就是eXtensible Markup Language,中文意思就是可扩展标记语言,标记语言就是那种用尖括号()括来括去的那种语言,比如说HTML。XML 的可扩展性也体现在它只定义了语言的格式,而并没有定义过多的关键字,也就是通常所说的标记(Tag),所以用户可以自由地选择定义标记。它的这种自由和 简单的语法规则也使得它广为流传,被用来表示各种数据。熟悉Lisp语言(一种被称为“一大堆”括号的语言)的同学可能觉得XML和Lisp语言有些类 似,不同的是XML用尖括号替代了Lisp语言中的圆括号(())。事实就是他们都是那么相似,那么多语言似乎都是等价的,不同的只是那些应用语言的人。
XML在XMLRPC充当什么角色呢?
答 案就是“交换的数据格式”。在Sun RPC中,调用双方传递的数据是二进制的,而在XMLRPC中数据将是XML格式的。那么为什么用XML而不用二进制呢?我想一方面应该是为了兼容更多的 语言,因为这个世界上除了C/C++等编译语言,还有很多类似python,perl,javascrīpt等的脚本语言(最近有些文章也称其为“动态语 言”,因为他们通常不需要自己管理内存),另一方面是为了隔离操作系统的差异,比如说Little Endian和Big Endian的差异等。基于种种原因,XMLRPC选择了XML这种中间语言作为其信息的格式,然后由各个语言负责将其转变成各自native(本土)的 数据类型。关于为了兼容各个语言所发明的中间语言还有IDL(Interface Definition Language:接口定义语言),它被用于CORBA接口的定义。
关于XML-RPC的更多信息请到它的官方网站去学习,其中有XMLRPC的规范(Specification),不过是相当得简单的,因为XMLRPC本身就特别的简单,不相信?好,那下面我就请大家和我一起来学习如何写一个加法的XMLRPC。
服务器端:
因为XMLRPC的消息是用标准的HTTP协议进行传递的,所以我们的服务端也采用运行在apache上的php来开发,作为必要条件,我们需要在我们的系统上安装上php语言的xmlrpc开发库。我选用phpxmlrpc,因为php在很多情况下并不启用对XMLRPC的支持。
下载之后,将其的lib目录拷贝出来并命名为libphpxmlrpc,下面书写我们的第一个XMLRPC实现:
file: xmlrpc_server.php
include ("libphpxmlrpc/xmlrpc.inc"); include ("libphpxmlrpc/xmlrpcs.inc"); if ($_SERVER['REQUEST_METHOD'] != 'POST') exit(0); $add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt)); $add_doc = "Add the two integer together"; function add($params) { global $xmlrpcerruser; $val = php_xmlrpc_decode($params); $ret = $val[0] + $val[1]; return new xmlrpcresp(new xmlrpcval($ret, "int")); } $server = new xmlrpc_server(array( "add" => array( "function" => "add", "signature" => $add_sig, "docstring" => $add_doc ))); ?> |
是不是很简单明了啊?通过上面的代码我想您肯定可以通过CPCS(Copy, Paste, Change, Save)的方法举一反三出更多的XMLRPC来。
客户端:
为 了测试我们的程序是否正确,需要写一个客户端来,用什么来写呢?或者是用什么写更方便呢?简单思考之后,python应该比较简单,简单的google了 一下,得知xmlrpc的实现已经被纳入官方python的支持之中,窃喜,通过CPCS方法很快就写出了客户端实现,
如下:
File: xmlrpc_client.py
#!/bin/env python from xmlrpclib import * import sys # xmlrpc add sample in python server = Server("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"); try: retval = server.add(12, 13) print retval except Error, v: print "Error", v |
注:我开发的根目录为/home/xiaosuo/xmlrpc/所以网页的目录也就自然为http://127.0.0.1/~xiaosuo/xmlrpc/,以下相同。
测试:
xiaosuo@gentux xmlrpc $ ./xmlrpc_client.py 25 |
Ok!一切顺利。
以下还有几个语言的实现版本请看客们自行分析,并通过CPCS方法学习使用:
使用phpxmlrpc的php版:
include ("libphpxmlrpc/xmlrpc.inc"); include ("libphpxmlrpc/xmlrpcs.inc"); if (isset($_POST['var1']) && isset($_POST['var2'])) { $client = new xmlrpc_client("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"); $msg = new xmlrpcmsg("add", array( new xmlrpcval($_POST['var1'], "int"), new xmlrpcval($_POST['var2'], "int"))); $retval = &$client->send($msg); if ($retval->faultCode()) { print_r("An error occurred: "); print_r("Code: " . htmlspecialchars($retval->faultCode()) . " Reason: " . htmlspecialchars($retval->faultString())); } else { $sum = $retval->value()->scalarval(); } } ?> br> "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd"> |
使用来自xmlrpc-c的xmlrpc命令的shell版:
#!/bin/bash xmlrpc http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php add i/12 i/13 |
使用xmlrpc-c的C语言版:
/* * Compile method: * gcc -o xmlrpc_client.out `xmlrpc-c-config --libs --cflags` xmlrpc_client.c -lxmlrpc_client */ #include #include #include #include #define NAME "XML-RPC C Test Client" #define VERSION "1.0" #define die_if_fault_occurred(x) / do { / if ((x)->fault_occurred) / abort(); / } while(0) int main(int const argc, const char ** const argv) { xmlrpc_env env; xmlrpc_value * resultP; int sum; char *const url = "http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"; char *const methodName = "add"; /* Initialize our error-handling environment. */ xmlrpc_env_init(&env); /* Start up our XML-RPC client library. */ xmlrpc_client_init2(&env, XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION, NULL, 0); die_if_fault_occurred(&env); /* Make the remote procedure call */ resultP = xmlrpc_client_call(&env, url, methodName, "(ii)", (xmlrpc_int32) 12, (xmlrpc_int32) 13); die_if_fault_occurred(&env); /* Get our state name and print it out. */ xmlrpc_parse_value(&env, resultP, "i", &sum); die_if_fault_occurred(&env); printf("The sum is %d/n", sum); /* Dispose of our result value. */ xmlrpc_DECREF(resultP); /* Clean up our error-handling environment. */ xmlrpc_env_clean(&env); /* Shutdown our XML-RPC client library. */ xmlrpc_client_cleanup(); return 0; } |
使用Frontier库的Perl版本:
#!/bin/env perl # use strict; use warnings; use Frontier::Client; my $server = Frontier::Client->new( url => "http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"); my $sum = $server->call("add", (12, 13)); print $sum . "/n"; |
是不是开始感叹XMLRPC被支持的程度了,事实上远不止这些,更多的语言支持请到XMLRPC的官方网站的实现列表里面去查看。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP中API如何处理异常处理和重试机制在PHP中,API已经成为许多网站和应用程序的核心,因为它们提供各种功能和功能。然而,在使用API时,我们经常会遇到许多问题,如网络连接问题,响应超时,无效请求等。在这种情况下,我们需要了解如何处理异常和重试机制来确保我们的应用程序的可靠性和稳定性。异常处理在PHP中,异常处理是一种更加优雅和可读的错误处

PHP快手API接口开发指南:如何构建视频下载和上传系统引言:随着社交媒体的蓬勃发展,越来越多的人喜欢在互联网上分享自己的生活点滴。其中,短视频平台的受欢迎程度持续升高,已成为人们记录并分享自己生活、娱乐的重要方式。PHP快手API接口是一个强大的工具,可以帮助开发者构建功能丰富的视频下载和上传系统。在本文中,我们将探讨如何使用PHP快手API接口来开发一个

PHP是一种非常流行的服务器端脚本语言,广泛应用于Web开发。在Web开发中,API是非常重要的组成部分,负责与客户端进行通信。其中,API的性能和效率对于一个应用程序的用户体验非常重要。在API开发过程中,缓存和冗余数据是两个重要的概念,本文将介绍如何在PHP中处理它们,以提高API的性能和可靠性。一、缓存概念缓存是一种在Web应用程序中广泛使用的优化技术

通过PHP快手API接口,实现视频的收藏和分享在移动互联网时代,短视频已成为人们生活中不可或缺的一部分。快手作为中国主流的短视频社交平台,拥有庞大的用户群体。为了提升用户体验,我们可以通过PHP快手API接口实现视频的收藏和分享功能,让用户更方便地管理和分享自己喜欢的视频。一、使用快手API快手提供了丰富的API接口,包括视频搜索、视频详情、视频收藏和视频分

随着社交媒体的普及,越来越多的人开始利用Twitter等社交媒体平台来进行营销和推广。这种方式很有效,但需要花费大量的时间和精力来保持活跃度。如果你想在Twitter上推广自己的品牌或服务,但又没有足够的时间或资源来管理一个活跃的Twitter账户,那么你可以考虑使用Twitter机器人。Twitter机器人是一种自动化工具,它可以帮助你在Twitter上自

在现代的Web应用程序中,API接口通常是实现服务接口化的一种方式。PHP语言在实现这样的API接口时,需要考虑如何处理多个API客户端的情况。在一般情况下,每个API客户端的请求都会经过PHP实现的RESTful接口进行处理。但是,当需要应对大量的API客户端请求时,如何提高接口处理效率,减少系统开销,这变成了一个亟待解决的

PHP快手API接口开发指南:如何构建视频播放和评论系统引言:随着快手(Kuaishou)平台的崛起,许多开发者通过其API接口开发了各种各样的应用程序。本文将介绍如何使用PHP开发快手视频播放和评论系统的API接口,帮助读者快速上手并构建自己的应用程序。一、准备工作在开始之前,您需要确保您已经完成以下准备工作:安装PHP环境:您需要在本地开发环境搭建好PH

PHPAPI限流可以通过固定窗口计数器、滑动窗口计数器、漏桶算法和令牌桶算法实现。1.固定窗口计数器通过时间窗口限制请求次数。2.滑动窗口计数器细化时间窗口,提供更精确的限流。3.漏桶算法以恒定速率处理请求,防止突发流量。4.令牌桶算法允许一定程度的突发流量,通过消耗令牌来控制请求。
