백엔드 개발 PHP 튜토리얼 PHP中XML-RPC使用详解

PHP中XML-RPC使用详解

Jun 20, 2016 pm 01:01 PM
php api

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 add sample in php


>
/>
+
/>

/>


使用来自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的官方网站的实现列表里面去查看。


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

API가 PHP에서 예외 처리 및 재시도 메커니즘을 처리하는 방법 API가 PHP에서 예외 처리 및 재시도 메커니즘을 처리하는 방법 Jun 17, 2023 pm 03:52 PM

PHP의 API가 예외 처리 및 재시도 메커니즘을 처리하는 방법 PHP에서 API는 다양한 특징과 기능을 제공하므로 많은 웹사이트와 애플리케이션의 핵심이 되었습니다. 그러나 API를 사용하다 보면 네트워크 연결 문제, 응답 시간 초과, 잘못된 요청 등 많은 문제에 직면하는 경우가 많습니다. 이 경우 애플리케이션의 신뢰성과 안정성을 보장하기 위해 예외 처리 및 재시도 메커니즘을 이해해야 합니다. 예외 처리 PHP에서 예외 처리는 보다 우아하고 읽기 쉬운 오류 처리입니다.

PHP Kuaishou API 인터페이스 개발 가이드: 비디오 다운로드 및 업로드 시스템 구축 방법 PHP Kuaishou API 인터페이스 개발 가이드: 비디오 다운로드 및 업로드 시스템 구축 방법 Jul 22, 2023 am 11:13 AM

PHP Kuaishou API 인터페이스 개발 가이드: 비디오 다운로드 및 업로드 시스템 구축 방법 소개: 소셜 미디어의 급속한 발전으로 점점 더 많은 사람들이 자신의 삶의 순간을 인터넷에서 공유하고 싶어합니다. 그중에서도 짧은 영상 플랫폼은 계속해서 인기를 끌며 사람들이 자신의 삶과 오락을 기록하고 공유하는 중요한 수단이 되었습니다. PHP Kuaishou API 인터페이스는 개발자가 기능이 풍부한 비디오 다운로드 및 업로드 시스템을 구축하는 데 도움을 줄 수 있는 강력한 도구입니다. 이 기사에서는 PHP Kuaishou API 인터페이스를 사용하여 API를 개발하는 방법을 살펴보겠습니다.

API가 PHP에서 캐싱 및 중복 데이터를 처리하는 방법 API가 PHP에서 캐싱 및 중복 데이터를 처리하는 방법 Jun 17, 2023 pm 08:27 PM

PHP는 웹 개발에 널리 사용되는 매우 인기 있는 서버측 스크립팅 언어입니다. 웹 개발에서 API는 클라이언트와의 통신을 담당하는 매우 중요한 구성 요소입니다. 그 중에서도 API 성능과 효율성은 애플리케이션의 사용자 경험에 매우 중요합니다. 캐싱과 중복 데이터는 API 개발 중 두 가지 중요한 개념입니다. 이 기사에서는 API의 성능과 안정성을 향상시키기 위해 PHP에서 이를 처리하는 방법을 소개합니다. 1. 캐싱 개념 캐싱은 웹 애플리케이션에서 널리 사용되는 최적화 기술입니다.

PHP Kuaishou API 인터페이스를 통해 비디오를 수집하고 공유하는 방법 PHP Kuaishou API 인터페이스를 통해 비디오를 수집하고 공유하는 방법 Jul 21, 2023 pm 03:46 PM

PHP Kuaishou API 인터페이스를 통해 비디오 수집 및 공유가 실현될 수 있습니다. 모바일 인터넷 시대에 짧은 비디오는 사람들의 삶에 없어서는 안될 부분이 되었습니다. 중국의 주류 단편 비디오 소셜 플랫폼인 Kuaishou는 엄청난 사용자 기반을 보유하고 있습니다. 사용자 경험을 향상시키기 위해 PHP Kuaishou API 인터페이스를 통해 비디오 수집 및 공유 기능을 구현하여 사용자가 좋아하는 비디오를 보다 편리하게 관리하고 공유할 수 있도록 합니다. 1. Kuaishou API 사용 Kuaishou는 비디오 검색, 비디오 세부 정보, 비디오 수집 및 비디오 분석을 포함한 풍부한 API 인터페이스를 제공합니다.

PHP API를 사용하여 트위터 봇을 만드는 방법 PHP API를 사용하여 트위터 봇을 만드는 방법 Jun 20, 2023 am 08:32 AM

소셜미디어의 인기가 높아지면서 트위터 등 소셜미디어 플랫폼을 활용해 마케팅과 홍보를 하는 사람들이 늘고 있다. 이 접근 방식은 효과적이지만 활동적인 상태를 유지하려면 많은 시간과 노력이 필요합니다. 트위터에서 브랜드나 서비스를 홍보하고 싶지만 활성 트위터 계정을 관리할 시간이나 리소스가 충분하지 않은 경우 트위터 봇 사용을 고려할 수 있습니다. 트위터 봇은 트위터에 자신만의 게시물을 작성하는 데 도움이 되는 자동화된 도구입니다.

PHP API에 대한 속도 제한 기술을 설명하십시오. PHP API에 대한 속도 제한 기술을 설명하십시오. Apr 08, 2025 am 12:08 AM

PHPAPI 전류 제한은 고정 창 카운터, 슬라이딩 창 카운터, 누출 된 버킷 알고리즘 및 토큰 버킷 알고리즘을 통해 구현할 수 있습니다. 1. 고정 창 카운터는 시간 창을 통한 요청 수를 제한합니다. 2. 슬라이딩 윈도우 카운터는보다 정확한 전류 제한을 제공하기 위해 시간 창을 개선합니다. 3. 누출 된 버킷 알고리즘은 파열 트래픽을 방지하기 위해 일정한 속도로 요청을 처리합니다. 4. 토큰 버킷 알고리즘은 어느 정도의 버스트 트래픽을 허용하고 토큰을 소비하여 요청을 제어합니다.

API가 PHP에서 여러 API 클라이언트를 처리하는 방법 API가 PHP에서 여러 API 클라이언트를 처리하는 방법 Jun 17, 2023 pm 11:39 PM

최신 웹 애플리케이션에서 API 인터페이스는 일반적으로 서비스 인터페이스를 구현하는 방법입니다. 이러한 API 인터페이스를 PHP 언어로 구현할 때 여러 API 클라이언트를 처리하는 방법을 고려해야 합니다. 일반적인 상황에서 각 API 클라이언트 요청은 PHP가 구현한 RESTful 인터페이스를 통해 처리됩니다. 그러나 대량의 API 클라이언트 요청을 처리해야 하는 경우 어떻게 인터페이스 처리 효율성을 높이고 시스템 오버헤드를 줄일 수 있는지가 시급한 문제가 되었습니다.

PHP Kuaishou API 인터페이스 개발 가이드: 비디오 재생 및 댓글 시스템 구축 방법 PHP Kuaishou API 인터페이스 개발 가이드: 비디오 재생 및 댓글 시스템 구축 방법 Jul 21, 2023 pm 10:37 PM

PHP Kuaishou API 인터페이스 개발 가이드: 비디오 재생 및 댓글 시스템 구축 방법 소개: Kuaishou 플랫폼의 등장으로 많은 개발자들이 API 인터페이스를 통해 다양한 애플리케이션을 개발했습니다. 이 기사에서는 독자가 빠르게 시작하고 자신의 애플리케이션을 구축할 수 있도록 PHP를 사용하여 Kuaishou 비디오 재생 및 댓글 시스템의 API 인터페이스를 개발하는 방법을 소개합니다. 1. 준비 작업 시작하기 전에 다음 준비 작업을 완료했는지 확인해야 합니다. PHP 환경 설치: 로컬 개발 환경에서 PH를 설정해야 합니다.

See all articles