Heim Backend-Entwicklung PHP-Tutorial 在PHP中利用XML技术构造远程服务(转)-PHP教程,PHP应用

在PHP中利用XML技术构造远程服务(转)-PHP教程,PHP应用

Jun 23, 2016 pm 02:29 PM
php应用

在php中利用xml技术构造远程服务

未来的web将是以服务为中心的web,xml_rpc标准使得编写和应用服务变得非常简单。本文介绍xml_rpc标准及其php实现,并通过实例示范了如何在php中开发xml_rpc服务和客户程序。

一、服务式web
从内容提供商所采用的简单方法到uddi(universal description,discovery and integration)的未来构想,业界已经有大量关于“服务式web”的说明和评论。就web的初创阶段来说,它只是一个文档的集散地,提供的只是一些可浏览的信息。随着web的发展,在web上运行服务越来越具有吸引力。未来,web将成为企业为客户和其他企业提供便捷服务的载体。b2b和b2c模式间的协同就可以看成是一种服务式web。

一个很重要的问题是,web上究竟可以提供哪些服务?web能够提供的服务非常多,其中有些服务现在已经在使用,有些服务在不久的将来就会出现。为了说明问题,下面列出了一小部分可以通过web提供的服务:

面向主题的垂直搜索引擎。
供用户查找信息的知识库。
用户可以请教问题的专家系统。
银行服务。
新闻和信息出版服务。
数字化支付相关的服务。
图形处理服务。
卫生和健康服务。

那么,企业和组织通过web提供服务的正确途径是什么呢?这是一个很重要的问题。今天,有些服务提供html界面,它们通过文档的形式提供服务,但在服务界面的背后隐藏着什么?在占领web的竞赛中,web浏览器并不孤单,移动电话、手持设备以及微波炉之类的设备都想要访问web、查询数据库、转换数据、提取信息,等等。要实现真正的服务式web,在表现层(html)之下应该还有另外一层。

二、xml_rpc标准
xml或许是近10年来最为重要的标准,xml词汇表(vocabulary)为企业构造服务环境提供了基石。要构建服务式web就有必要学习xml_rpc标准,这不仅是因为xml_rpc对于把服务放到web上很有用,而且因为xml_rpc是一种已经成形的、很容易采用的标准。对于b2b服务来说,提供服务的标准是极其重要的,共同遵循标准的公司可以利用其它公司提供的服务获得快速的增长。无法想象在各种私有的服务标准之上可以建立起真正的服务式web,服务必须有一种可以遵循的标准。

xml_rpc是一种面向internet分布式处理的标准。rpc即为remote procedure call(远程过程调用)的缩写,它是一种远程调用机制,用于调用可能驻留在其他机器之上以及可能用其他语言编写的过程。远程过程调用是分布式计算的重要支柱。例如,在一个分布式计算环境中,我们可以寻找和利用在其他机器上运行的执行加法和减法操作的过程,执行加法操作的过程可能用apl编写、在rs6000机器上运行,执行减法操作的过程可能用c编写、在unix上运行。其他要使用这种分布式计算器的开发者同样可以利用它们,或者他也可以选用另外更好的计算器。

在rpc中,过程(procedure)是最主要的构件,服务器提供的就是供客户端调用的过程。过程可以接收参数并返回结果。xml_rpc以http作为协议载体,通过发送和接收数据的xml词汇表实现rpc机制。xml_rpc服务器接收xml_rpc请求并返回xml_rpc应答,xml_rpc客户程序发送xml_rpc请求并接收xml_rpc应答。服务器和客户必须按照xml_rpc标准的要求处理应答和请求。

三、xml_rpc协议
完整的xml_rpc规范可以在http://www.xmlrpc.com/spec找到。下面是其要点说明。

3.1 xml_rpc请求

xml_rpc请求应该是http post请求,它的正文是xml格式。请求的xml部分格式如下:

<?xml version="1.0" ?>
<methodcall>
<methodname>examples.getstatename</methodname>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodcall>


指定数据发送到哪里的url并未在这里指定。如果服务器专门用来进行rpc处理,它可能是“/”。上述xml文档中的有效载荷是一个“methodcall”结构。methodcall必须包含一个“methodname”子元素,“methodname”子元素包含一个描述待调用方法的字符串。如何解释“methodname”的内容完全由服务器决定,例如它可以是一个执行文件的名字,可以是数据库中记录的名字,或者任何其他东西。如果过程接收参数,“methodcall”可以包含一个“params”元素以及若干个“param”子元素。每一个“param”元素包含一个带有类型描述符的值,类型描述符如下表所示:


标记 说明
<i4>或<int> 四字节的带符号整数,如12
<boolean> 0(false),或1(true)
<string> 字符串,如“hello world”
<double> 双精度带符号浮点数,如-12.214
<datetime.iso8601> 日期/时间,如19980717t14:08:55
<base64> base64编码的二进制数据,如ew91igbid0ihjlqgdghpcye


3.1.1 结构

值可以是一个结构,结构用元素描述。每个包含多个,每个包含一个和一个。下面是一个由两个元素构成的结构:

<struct>
<member>
<name>name</name>
<value><string>member1</string></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>


可以嵌套,任意可以包含或者任意其它类型,包括

3.1.2 数组

值可以是数组类型,数组用元素描述。每个元素包含一个元素,元素里面可以包含任意多个元素。下面是数组元素的一个例子:

<array>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><string>hello</string></value>
</data>
</array>


元素没有名字。如前例所示,元素的值可以是各种类型。元素可以嵌套,任何都可以包含或者其他类型,如上面介绍的

3.2 xml_rpc应答

xml_rpc应答是一个http应答,内容类型是text/xml。应答正文的格式如下:

<?xml version="1.0"?>
<methodresponse>
<params>
<param>
<value><string>abcdefg</string></value>
</param>
</params>
</methodresponse>


可能包含一个结构,或者可能包含一个结构,具体由过程调用是否成功决定。结构与xml请求中的一样,元素的语法如下:

<fault>
<value>
<struct>
<member>
<name>faultcode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultstring</name>
<value><string>error!</string></value>
</member>
</struct>
</value>
</fault>


四、基于xml_rpc的web服务
利用xml_rpc构造和使用服务是很方便的。企业为自己提供的各种服务部署xml_rpc服务器,用户、客户软件和客户企业就可以使用这种服务构造出高端服务或者面向最终用户的应用。这种提供更有效、廉价和优质服务的竞争将极大地提高应用服务的质量。

但这里还存在一些问题有待解决,例如怎样编目、索引、搜索web上的服务?uddi试图解决这个问题,不过这个标准并不简单,而且业界对它的反应也尚未明了。然而,在企业内部应用xml_rpc不仅能够改善代码的可重用性,而且还会带来一种全新的分布式计算模式,在此后的数年中它必将成为一种重要的知识财富。xml_rpc的发展从解决分布式计算问题以及成为服务式web的基本层面开始,从而获得了一个非常好的开端,其后必将紧随着人们对该标准的热衷。既然如此,现在就让我们来看看xml_rpc的实际应用吧!

4.1 在php中应用xml_rpc

对于提供web服务来说,php是一种非常理想的语言。我们只需编写好php代码然而把它放到一个合适的位置,就立即有了一个可通过url“调用”的服务。php中的xml_rpc实现可能复杂也可能简单,但我们拥有许多种选择。这里我们选用的是来自useful information company的xml_rpc实现,它的代码和文档可以从http://xmlrpc.usefulinc.com/下载。

这个xml_rpc实现的基本类涉及两个文件:

xmlrpc.inc:包含xml_rpc的php客户端所需要的类

xmlrpcs.inc:包含xml_rpc的php服务器所需要的类

4.2 客户端

编写xml_rpc客户端意味着:

1.创建一个xml_rpc请求消息

2.设置xml_rpc参数

3.创建一个xml_rpc消息

4.发送消息

5.获得应答

6.解释应答

请看下面这个例子:

<?php
$f=new xmlrpcmsg(examples.getstatename,array(new xmlrpcval(14, "int")));
$c=new xmlrpc_client("/rpc2", "betty.userland.com", 80);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultcode()) {
print "状态代码". $http_post_vars["stateno"] . "是" .
$v->scalarval() . "<br>";
print "<hr>这是服务器的应答<br><pre>" .
htmlentities($r->serialize()). "</pre><hr>\n";
} else {
print "错误: ";
print "代码: " . $r->faultcode() .
" 原因: " .$r->faultstring()."<br>";
}
?>


在这个例子中,我们先创建了一个调用“examples.getstatename”方法的xml_rpc消息,并传递了一个类型为“int”值为14的整数参数。然后,我们创建了一个描述待调用url(路径、域和端口)的客户。接着,我们发送了消息,接收应答对象并检查错误。如果不存在错误,我们就显示结果。

编写rpc客户程序时要用到的主要函数如下:

创建客户用:

$client=new xmlrpc_client($server_path, $server_hostname, $server_port);

发送消息的方法是:

$response=$client->send($xmlrpc_message);

它返回的是xmlrpcresp的一个实例。我们所传递的消息是xmlrpcmsg的实例,它用如下方法创建:

$msg=new xmlrpcmsg($methodname, $parameterarray);

methodname是待调用的方法(过程)的名字,parameterarray是xmlrpcval对象的php数组。例如:

$msg=new xmlrpcmsg("examples.getstatename", array(new xmlrpcval(23, "int")));

xmlrpcval对象可以用如下形式创建:

<?php
$myval=new xmlrpcval($stringval);
$myval=new xmlrpcval($scalarval, "int" | "boolean" | "string" | "double" | "datetime.iso8601" | "base64");
$myval=new xmlrpcval($arrayval, "array" | "struct");
?>


第一种形式创建的是xmlrpc字符串值。第二种形式创建的是描述值和类型的值。第三种形式通过在数组之类的结构中组合其他xmlrpc值创建复杂的对象,例如:

<?php
$myarray=new xmlrpcval(array(new xmlrpcval("tom"), new xmlrpcval("dick"),new xmlrpcval("harry")), "array");
$mystruct=new xmlrpcval(array(
"name" => new xmlrpcval("tom"),
"age" => new xmlrpcval(34, "int"),
"geek" => new xmlrpcval(1, "boolean")),"struct");
?>


应答对象是xmlrpcresp类型,通过调用客户对象的send方法获得。在服务器端,我们可以通过如下方式创建xmlrpcresp类型的对象:

$resp=new xmlrpcresp($xmlrpcval);

而在客户端,则使用如下方法从应答获取xmlrpcval:

$xmlrpcval=$resp->value();

接下来我们就可以用下面这种方式获取描述应答结果的php变量:

$scalarval=$val->scalarval();

对于复杂的数据类型,有两个函数非常有用,这两个函数都在xmlrpc.inc内:

$arr=xmlrpc_decode($xmlrpc_val);

该函数返回一个php数组,其中包含了xmlrpcval变量$xmlrpc_val之内的数据,这些数据已经被转换成php本身具有的变量类型。

$xmlrpc_val=xmlrpc_encode($phpval);

该函数返回一个xmlrpcval类型的值,其中包含了$phpval描述的php数据。对于数组和结构,此方法能够进行递归分析。注意,这里不存在对非基本数据类型(如base-64数据,或者日期-时间数据)的支持。

4.3 服务器端

利用xmlrpcs.inc提供的类编写服务非常简单。要创建一个服务,我们按照如下方式创建xmlrpc_server的实例:

<?php
$s=new xmlrpc_server( array("examples.myfunc" =>
array("function" => "foo")));
?>

传递给xmlrpc_server构造函数的是一个联合数组的联合数组。过程“examples.myfunc”调用“foo”函数,由于这个原因foo被称为方法句柄。

编写方法句柄很简单。下面是一个方法句柄的骨架:

<?php
function foo ($params) {
global $xmlrpcerruser; // 引入用户错误代码值
// $params是一个xmlrpcval对象的数组
if ($err) {
// 错误条件
return new xmlrpcresp(0, $xmlrpcerruser+1, // 用户错误1
"error!");
} else {
// 成功
return new xmlrpcresp(new xmlrpcval("fine!", "string"));
}
}
?>


可以看到,程序检查了错误,如存在错误则返回错误(从$xmlrpcerruser+1开始);否则如果一切正常,则返回描述操作成功信息的xmlrpcresp。

五、应用实例
在下面这个例子中我们将构造一个服务。对于给定的数值n,服务返回n*2。客户端利用该服务计算5*2的值。

服务器端的代码如下:

<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");
function foo ($params)
{
global $xmlrpcerruser; // 引入用户错误代码值
// $params是xmlrpcval对象的一个数组
$vala=$params->params[0];
$sval=$vala->scalarval();
$ret=$sval*2;
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
$s=new xmlrpc_server( array("product" =>
array("function" => "foo")));
?>


客户端代码如下:

<?php
include("xmlrpc.inc");
if ($http_post_vars["number"]!="") {
$f=new xmlrpcmsg(product,array(new xmlrpcval($http_post_vars["number"], "int")));
$c=new xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia.com.ar", 80);
$c->setdebug(0);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultcode()) {
print "number ". $http_post_vars["number"] . " is " .
$v->scalarval() . "<br>";
print "<hr>来自服务器的结果!<br><pre>" .
htmlentities($r->serialize()). "</pre><hr>\n";
} else {
print "操作失败: ";
print "代码: " . $r->faultcode() .
" 原因: " .$r->faultstring()."<br>";
}
}
print "<form method=\"post\">
<input name=\"number\" value=\"${number}\">
<input type=\"submit\" value=\"go\" name=\"submit\"></form><p>
输入一个数值";
?>


结束语:xml_rpc服务的运作还涉及其他许多基础设施和基础工作,如分布式过程的编目和索引机制,又如在编程语言中处理xml_rpc的更好接口等。有关xml_rpc和服务式web的报道非常多,让我们密切关注它们的发展吧!
文章整理:西部数码

以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP-Anwendung: Aktuelles Datum als Dateinamen verwenden PHP-Anwendung: Aktuelles Datum als Dateinamen verwenden Jun 20, 2023 am 09:33 AM

In PHP-Anwendungen müssen wir manchmal Dateien mit dem aktuellen Datum als Dateinamen speichern oder hochladen. Obwohl es möglich ist, das Datum manuell einzugeben, ist es bequemer, schneller und genauer, das aktuelle Datum als Dateinamen zu verwenden. In PHP können wir die Funktion date() verwenden, um das aktuelle Datum abzurufen. Die Verwendungsmethode dieser Funktion ist: date(format, timestamp); wobei format die Datumsformatzeichenfolge und timestamp der Zeitstempel ist, der das Datum und die Uhrzeit darstellt. Wenn dieser Parameter nicht übergeben wird, wird er verwendet

Tutorial: Verwenden Sie Firebase Cloud Messaging, um geplante Nachrichten-Push-Funktionen in PHP-Anwendungen zu implementieren Tutorial: Verwenden Sie Firebase Cloud Messaging, um geplante Nachrichten-Push-Funktionen in PHP-Anwendungen zu implementieren Jul 25, 2023 am 11:21 AM

Tutorial: Verwenden von Firebase Cloud Messaging zum Implementieren geplanter Nachrichten-Push-Funktionen in PHP-Anwendungen. Übersicht Firebase Cloud Messaging (FCM) ist ein kostenloser Nachrichten-Push-Dienst von Google, der Entwicklern dabei helfen kann, Echtzeitnachrichten an Android-, iOS- und Webanwendungen zu senden. Dieses Tutorial führt Sie durch die Verwendung von FCM zur Implementierung geplanter Nachrichten-Push-Funktionen über PHP-Anwendungen. Schritt 1: Erstellen Sie zunächst ein Firebase-Projekt in F

Generische Programmierung in PHP und seinen Anwendungen Generische Programmierung in PHP und seinen Anwendungen Jun 22, 2023 pm 08:07 PM

1. Was ist generische Programmierung? Generische Programmierung bezieht sich auf die Implementierung eines gemeinsamen Datentyps in einer Programmiersprache, sodass dieser Datentyp auf verschiedene Datentypen angewendet werden kann, wodurch eine Wiederverwendung und Effizienz des Codes erreicht wird. PHP ist eine dynamisch typisierte Sprache. Sie verfügt nicht über einen starken Typmechanismus wie C++, Java und andere Sprachen, daher ist es nicht einfach, generische Programmierung in PHP zu implementieren. 2. Generische Programmierung in PHP Es gibt zwei Möglichkeiten, generische Programmierung in PHP zu implementieren: die Verwendung von Schnittstellen und die Verwendung von Merkmalen. Erstellen Sie mithilfe einer Schnittstelle eine Schnittstelle in PHP

Redis-Operation mit regulären Ausdrücken in PHP-Anwendungen Redis-Operation mit regulären Ausdrücken in PHP-Anwendungen May 16, 2023 pm 05:31 PM

Redis ist ein leistungsstarkes Schlüsselwertspeichersystem, das eine Vielzahl von Datenstrukturen unterstützt, darunter Zeichenfolgen, Hash-Tabellen, Listen, Mengen, geordnete Mengen usw. Gleichzeitig unterstützt Redis auch reguläre Ausdrucksabgleichs- und Ersetzungsvorgänge für String-Daten, was es äußerst flexibel und bequem bei der Entwicklung von PHP-Anwendungen macht. Um Redis für Operationen mit regulären Ausdrücken in PHP-Anwendungen zu verwenden, müssen Sie zuerst die Erweiterung phpredis installieren. Diese Erweiterung bietet eine Möglichkeit, mit dem Redis-Server zu kommunizieren.

Signaturauthentifizierungsmethode und ihre Anwendung in PHP Signaturauthentifizierungsmethode und ihre Anwendung in PHP Aug 06, 2023 pm 07:05 PM

Methode und Anwendung der Signaturauthentifizierung in PHP Mit der Entwicklung des Internets ist die Sicherheit von Webanwendungen immer wichtiger geworden. Die Signaturauthentifizierung ist ein gängiger Sicherheitsmechanismus, mit dem die Legitimität von Anfragen überprüft und unbefugter Zugriff verhindert wird. In diesem Artikel werden die Signaturauthentifizierungsmethode und ihre Anwendung in PHP vorgestellt und Codebeispiele bereitgestellt. 1. Was ist Signaturauthentifizierung? Die Signaturauthentifizierung ist ein Überprüfungsmechanismus, der auf Schlüsseln und Algorithmen basiert. Die Anforderungsparameter werden verschlüsselt, um einen eindeutigen Signaturwert zu generieren. Anschließend entschlüsselt der Server die Anforderung und überprüft die Signatur mithilfe desselben Algorithmus und Schlüssels.

Anwendung von PHP in der Website-Entwicklung auf Unternehmensebene Anwendung von PHP in der Website-Entwicklung auf Unternehmensebene Oct 27, 2023 pm 06:52 PM

Als eine der beliebtesten serverseitigen Skriptsprachen wird PHP häufig bei der Entwicklung von Websites auf Unternehmensebene verwendet. Seine Flexibilität, Skalierbarkeit und Benutzerfreundlichkeit machen PHP zur Sprache der Wahl für die Website-Entwicklung auf Unternehmensebene. In diesem Artikel wird die Anwendung von PHP bei der Website-Entwicklung auf Unternehmensebene erläutert. Zunächst einmal spielt PHP eine Schlüsselrolle bei der Entwicklung von Websites auf Unternehmensebene. Es kann zum Aufbau einer Vielzahl von Funktionen verwendet werden, darunter Benutzerauthentifizierung, Datenspeicherung, Datenanalyse und Berichterstellung. PHP kann nahtlos in Datenbanken integriert werden und unterstützt Mainstream-Daten

Tutorial: Verwenden Sie die Baidu Push-Erweiterung, um die Nachrichten-Push-Funktion in einer PHP-Anwendung zu implementieren Tutorial: Verwenden Sie die Baidu Push-Erweiterung, um die Nachrichten-Push-Funktion in einer PHP-Anwendung zu implementieren Jul 26, 2023 am 09:25 AM

Tutorial: Verwenden Sie die Baidu Cloud Push-Erweiterung (BaiduPush), um die Nachrichten-Push-Funktion in PHP-Anwendungen zu implementieren. Einführung: Mit der schnellen Entwicklung mobiler Anwendungen wird die Nachrichten-Push-Funktion in Anwendungen immer wichtiger. Um sofortige Benachrichtigungs- und Nachrichten-Push-Funktionen zu realisieren, bietet Baidu einen leistungsstarken Cloud-Push-Dienst, nämlich Baidu Cloud Push (BaiduPush). In diesem Tutorial erfahren Sie, wie Sie die Baidu Cloud Push Extension (PHPSDK) verwenden, um die Nachrichten-Push-Funktionalität in PHP-Anwendungen zu implementieren. Wir werden Baidu Cloud verwenden

Redis-Vorgangsprotokoll in der PHP-Anwendung Redis-Vorgangsprotokoll in der PHP-Anwendung May 15, 2023 pm 08:10 PM

Redis-Betriebsprotokolle in PHP-Anwendungen In PHP-Anwendungen wird Redis immer häufiger als Lösung zum Zwischenspeichern oder Speichern von Daten verwendet. Redis ist eine leistungsstarke Schlüsselwertspeicherdatenbank, die schnell, skalierbar und hochverfügbar ist und über vielfältige Datenstrukturen verfügt. Wenn wir Redis verwenden, benötigen wir ein Redis-Betriebsprotokoll, um den Betrieb der Anwendung besser zu verstehen und die Datensicherheit zu gewährleisten. Das Redis-Betriebsprotokoll kann alle Clients auf dem Redis-Server aufzeichnen

See all articles