本文目录
背景
认识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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!