为什么80%的码农都做不了架构师?>>>   

这篇文章提供所有实现XML-RPC协议所需要的内容。


一览

XML-RPC是一个工作在因特网上的远端程序调用(Remote Procedure Calling)协议。

XML-RPC消息是一个HTTP-POST请求(Request)。请求的主题是在XML中。一个在服务器上执行的程序和它返回的值也是使用XML来格式化的。

被终端调用的程序参数可以是标量(scalars)、数值、字符串、日期等;并且还可以是混合记录和列表结构。

示例

下面是一个XML-RPC请求的例子:

   1: POST /RPC2 HTTP/1.0
   2: User-Agent: Frontier/5.1.2 (WinNT)
   3: Host: betty.userland.com
   4: Content-Type: text/xml
   5: Content-length: 181
   6: 
   7: <?xml version="1.0"?>
   8: <methodCall>
   9:     <methodName>examples.getStateName</methodName>
  10:     <params>
  11:         <param>
  12:             <value>
  13:                 <i4>41</i4>
  14:             </value>
  15:         </param>
  16:     </params>
  17: </methodCall>

头部(Header)需要

在头部第一行中的URI的格式并没有被指定。例如,如果服务器只处理XML-RPC调用的话,它可以是空的、一个简单的斜线。然而,如果服务器是处理一个混合传入HTTP请求,我们允许URI帮助将请求导向到程序处理XML-RPC请求的代码处。如,/RPC2告诉服务器将请求导向到“RPC2”响应器。

一个用户代理(User-Agent)和主机(Host)必须被指定。

内容类型(Content-Type)必须是text/xml。

内容长度(Conteng-Length)必须被指定且必须正确。

负载(Payload)格式

payload是在xml中的一个简单的<methodCall>方法调用结构。

<methodCall>必须包括<methodName>子项,一个包括被调用方法的名字的字符串。这个字符串也许只是包括标识字符(大写或小写的A-Z)、数值字符(0-9)、下划线、点、冒号、斜线。这已经足够服务器云决定如何解释方法名了。

例如,方法名可以是一个包含执行引入请求(incoming request)脚本的文件名。它可以是数据库中的一个表的单元格名。或者它可以是被一个在层级式目录中的的一文件路径。

如果程序调用有参数,<methodCall>发源包括一个<params>参数子项。这个<params>子项能够包括任意数量的<param>,每一个<param>都有一个值。

标量(scalar)<value>值

<value>值可以是标量(scalar),类型如下表所示:

Tag Type Example

<i4> or <int>

four-byte signed integer

-12

<boolean>

0 (false) or 1 (true)

1

<string>

string

hello world

<double>

double-precision signed floating point number

-12.214

<dateTime.iso8601>

date/time

19980717T14:08:55

<base64>

ase64-encoded binary

eW91IGNhbid0IHJlYWQgdGhpcyE=

如果没有指定类型,类型就是字符串。

<struct>结构

一个值可以是<struct>类型的。

一个<struct>包括<member>,每一个<member>包括一个<name>和一个<value>。

下面是一个有两个<struct>元素的例子。

   1: <struct>
   2:      <member>
   3:           <name>lowerBound</name>
   4:           <value>
   5:                <i4>18</i4>
   6:           </value>
   7:      </member>
   8:      <member>
   9:           <name>upperBound</name>
  10:           <value>
  11:                <i4>139</i4>
  12:           </value>
  13:      </member>
  14: </struct>

<struct>可以是递归的,任何<value>可以包括一个<struct>或其他类型,包括下面要描述的<array>。

<array>数组

值可以是<array>数组类型的。

一个<array>包括一个独立的<data>元素,这个元素可以包括任意多个<value>。

下面是一个四元素数组的示例:

   1: <array>
   2:    <data>
   3:       <value><i4>12</i4></value>
   4:       <value><string>Egypt</string></value>
   5:       <value><boolean>0</boolean></value>
   6:       <value><i4>-31</i4></value>
   7:    </data>
   8: </array>

<array>元素没有名字。

你可以在上面的示例中使用混合类型。

<arrays>是可以递归的,任何值可以包括一个<array>或任意的类型,包括上文描述过的<struct>。

响应(Response)示例

下面是一个对XML-RPC请求的响应示例:

   1: HTTP/1.1 200 OK
   2: Connection: close
   3: Content-Length: 158
   4: Content-Type: text/xml
   5: Date: Fri, 17 Jul 1998 19:55:08 GMT
   6: Server: UserLand Frontier/5.1.2-WinNT
   7: 
   8: <?xml version="1.0"?>
   9: <methodResponse>
  10:     <params>
  11:         <param>
  12:             <value>
  13:                 <string>South Dakota</string>
  14:             </value>
  15:         </param>
  16:     </params>
  17: </methodResponse>

响应(Response)格式

除非有一个层等级的错误,不然总是会返回200成功码。

内容类型是text/xml。内容长度必须呈现且正确。

响应体是一个简单的XML结构<methodResponse>,它可以包括一个<params>,<params>可以包括一个独立的<value>。

<methodResponse>还可以包括一个<fault>。<fault>可以包括一个<value>。<value>可以包括一个包含有两个元素的<struct>,一个元素是<faultCode>,一个元素是<faultString>。

<methodResponse>可以不包括一个<fault>和<params>。

错误(Fault)示例

   1: HTTP/1.1 200 OK
   2: Connection: close
   3: Content-Length: 426
   4: Content-Type: text/xml
   5: Date: Fri, 17 Jul 1998 19:55:02 GMT
   6: Server: UserLand Frontier/5.1.2-WinNT
   7: 
   8: <?xml version="1.0"?>
   9:     <methodResponse>
  10:         <fault>
  11:             <value>
  12:                 <struct>
  13:                     <member>
  14:                         <name>faultCode</name>
  15:                         <value>
  16:                             <int>4</int>
  17:                         </value>
  18:                     </member>
  19:                     <member>
  20:                         <name>faultString</name>
  21:                         <value>
  22:                             <string>Too many parameters.</string>
  23:                         </value>
  24:                     </member>
  25:                 </struct>
  26:              </value>
  27:     </fault>
  28: </methodResponse>
  29: 

策略和目标


明文。这个协议的目标是在没有新的可以超越CGI接口的力量被提供时,制订一个可以跨越不同环境的兼容性的“根据”,防火墙软件可以看到内容类型是text/xml的POSTs。

可读。我们想要一个干净的可扩展的非常简单的格式。这使得一个HTML程序员能够看懂包括XML-RPC协议调用的文件、理解这个文件的用途以及可以修改它并让它在第一次或第二次尝试后工作起来成为了可能。

容易。我们想要它成为一个可以被很容易实现去快速在不同的环境与不同的操作系统中运行的协议。

转载于:https://my.oschina.net/skyler/blog/706112

『协议』XML-RPC 协议规格说明相关推荐

  1. 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用

    cz88 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用 Go 语言编写 进程内缓存结果,重复的 ip 查询响 ...

  2. Dubbo 3.0 前瞻之:常用协议对比及 RPC 协议新形态探索

    作者 | 郭浩(项升)  阿里巴巴经济体 RPC 框架负责人 导读:Dubbo 社区策划了[Dubbo 云原生之路]系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展 ...

  3. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)

    分布式微服务治理的核心在于: 微服务和分布式 (微服务框架)微服务的最优技术实现目前是: SpringBoot (RPC 框架)分布式的最优技术实现目前是: Thrift,Motan,Dubbo,Sp ...

  4. 使用springboot,http实现简单的RPC协议框架

    使用springboot,http实现简单的RPC协议框架 一. RPC协议的作用 二.RPC与HTTP的区别 三.实现一个简单的RPC客户端和服务端 1. 新建Springboot项目,访问本服务中 ...

  5. Dubbo3.0系列(6)- Dubbo3.0支持的RPC协议

    RPC 通信协议 Dubbo3 提供了 Triple(Dubbo3).Dubbo2 协议,这是 Dubbo 框架的原生协议.除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubb ...

  6. dubbo解析-从dubbo协议分析如何设计RPC协议

    本文基于dubbo 2.7.5版本代码 本文介绍一下dubbo协议的组成,通过对dubbo协议的学习,为我们以后设计自己的RPC协议提供指导.在下一篇文章中从代码上介绍dubbo如何使用Netty. ...

  7. 【RPC】RPC基础(二)RPC协议

    文章目录 RPC核心原理 1. RPC基础 1.2 RPC协议 为什么设计RPC协议 如何设计RPC协议 可扩展协议的设计 思考 RPC核心原理 1. RPC基础 1.2 RPC协议 RPC协议和HT ...

  8. RPC协议及常用框架

    https://www.jianshu.com/p/8ba4b7b834aa RPC协议 RPC:远程过程调用,原则上来说系统间跨进程的调用都属于RPC范畴 RMI/HTTP/dubbo/Spring ...

  9. 『HTTP知识点』什么是HTTP协议?(HTTP协议详解)

    面试问题汇总: 谈一下什么是HTTP协议? 谈一下请求.请求报文? 谈一下响应报文? HTTP请求/响应的步骤是什么,简单说一下? get和post请求有什么区别,简单谈一下? 简单说一下抓包工具? ...

  10. 『区块链+TR069协议』打造全球通用区块链物联网

    为什么需要『区块链+TR069协议』 通过区块链技术与TR069协议的完美结合,即可在分布式智能设备之间建立互相信任,安全可靠的通信桥梁.同时,又可对海量的,来自全球不同厂商,不同类型的物联网智能设备 ...

最新文章

  1. Spring中获取bean
  2. 前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...
  3. yolov5搭建环境_Yolov5环境配置和训练私有数据,YOLOv5,以及,私人
  4. 取余运算||快速幂(洛谷-P1226)
  5. HTML5小游戏代码大全
  6. 怎么接入WAPI网络防止被蹭网
  7. Effective Java 枚举和注解 第30条:用 enum 代替 int 常量
  8. matlab中sr锁存器,大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?...
  9. 解决:Docker Container exited with code 137
  10. 2022年我国城镇污水处理运营市场空间可达730亿元
  11. 电脑没有“立体声混音”设备怎么办,虚拟声卡安装教程
  12. php写入配置文件getshell,MIPCMS V3.1.0 远程写入配置文件Getshell过程分析(附批量getshell脚本)...
  13. TYUT太原理工大学2022数据库考试题型大纲
  14. LeetCode: 627. 变更性别
  15. Word突然不能复制粘贴怎么办?
  16. MFC在查找预编译头时遇到意外的文件结尾
  17. 网站搭建基础知识、流程概括
  18. 恶女阿楚在线观看,恶女阿楚剧情介绍
  19. PowerBI-DAX-RANKX(二)
  20. python中特别注意除号'/'和‘//’的区别

热门文章

  1. Java 的内存管理机制是怎样的?
  2. leetcode160 相交链表
  3. Win10 连接 Ubuntu16.04.3(通过Xdrp连接xfce4界面)
  4. MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss
  5. Windows7右键菜单栏添加打开cmd项
  6. C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述
  7. 你是否发现 职业能力危机,请 警惕
  8. 不怕烧钱怕翻车:雷军与马化腾现场“过招”
  9. 会出现 unreachable statement 的可能
  10. 开大你的音响,感受HTML5 Audio API带来的视听盛宴