用RPC-Client组件来调用XML-RPC协议


背景

认识XML-RPC协议主要是因为我用的博客程序WordPress有开放的XML-RPC协议,可以用来自动发布文章。其实也就是发送一段XML字符串到服务器端,然后再得到一段响应的XML字符串。有了Invoke-WebRequest或者Invoke-RestMethod这两条命令,已经事半功倍了,再加上PowerShell处理XML也很流畅,所以如果在PowerShell中调用XML-RPC协议,可行性不在话下。可是唯一让人略微头疼的是将PowerShell或者.NET对象序列化XML-RPC对象字符串时,每次都需要手动拼接。
今天我自己写了一个PowerShell Module,命令为:“RPC-Client”,能够自动序列化和发序列化XML-RPC对象。

思路

  • XML-RPC协议中的对象有integer,double,string,boolean,date/time,array,struct,base64这几种类型。前6种在PowerShell中都能找到与之直接相对应的.NET类型,唯独struct和base64让我费神。
  • struct其实是键值对,可以用HashTable代替。而且PowerShell定义HashTable的声明式语言简单明了。
  • base64字符串本身也是字符串,为了和string区分,我曾考虑给string添加一个NoteProperty,比如IsBase64,也曾考虑用C#定义一个类型名称为XML.RPC.Base64,然后再用Add-Type导入,但是最终我还是决定用字节数组byte[]来代替。
  • 因为我觉得Base64在数据传输中生来就是替代二进制文件的。比如Wordpress中要上传一张图片到博客,我们也是先转换成base64,然后把它包含在xml请求中。而从二进制文件到base64之间的互相转换怎么都逃不过字节数组,那用byte[]来代替base64岂不是认祖归宗。
PowerShell 数据类型 XML-RPC 数据类型
System.Array array
System.Byte[] base64
System.Boolean boolean
System.DateTime date/time
System.Double double
System.Double.Int64 integer
System.String string
System.Collections.Hashtable struct

例子

先看几个将PowerShell对象转换成XML-PRC对象的例子

PS> ConvertTo-RPCXmlObject 3
<int>3</int>
PS> ConvertTo-RPCXmlObject 6.8
<double>6.8</double>
PS> ConvertTo-RPCXmlObject $true
<boolean>1</boolean>
PS> ConvertTo-RPCXmlObject $false
<boolean>0</boolean>
PS>  ConvertTo-RPCXmlObject @('a',@(1,2,2),[datetime]::Now)
<array>
  <data><value><string>a</string></value><value><array>
  <data><value><int>1</int></value><value><int>2</int></value><value><int>2</int></value></data>
            </array></value><value><dateTime.iso8601>20150101T23:56:17</dateTime.iso8601></value></data>
            </array>

再看一个完整调用

# New RPCMethod
$method = 'wp.getPostTypes'
$params = @(1,'userName','Password')
$body = New-RPCMethod -MethodName $method  -Params $params

# Invoke RPCMethod
$blogRpcUrl = 'https://www.pstips.net/my-rpc.php' 
Invoke-RPCMethod -RpcServerUri $blogRpcUrl -RequestBody $body

脚本

脚本托管在PSClient-for-XML-RPC

×用微信扫描并分享
本文链接: https://www.pstips.net/rpc-client.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注