我们是一个广泛使用Powershell的Windows商店。我们还有一个Spacewalk,我想从现有的Powershell脚本中查询一些数据。 Spacewalk API通过XMLRPC公开。
我花了一些时间寻找如何做到这一点的例子,但信息真的很少。我能得到的最接近的是这个链接(不再可用) https://web.archive.org/web/20080202045713/http://thepowershellguy.com/blogs/posh/archive/2008/01/31/powershell-and-xmlrpc-posh-challenge-part-12.aspx
缺乏例子让我觉得我看错了方向。我知道new-webserviceproxy,我用它来查询Sharepoint,但我没有看到有人用它来进行XMLRPC调用。
用Perl或Python编写调用是微不足道的,但这不是我在这个特定情况下需要的...
我在这里走错路吗?
答案 0 :(得分:3)
我自己实施了这个,所以我想我会把它传给你。
你实际上可以下载DLL而不是自己编译源代码 - 我使用NuGet找到了DLL,但是有人说你可以从zip中获取它。
我决定在powershell中使用C#代码实现接口,以最大限度地提高可移植性/易开发性。如果需要,可以将C#代码编译为DLL并使用PowerShell加载,但是每次要对C#代码进行更改时,都必须返回并重新编译。在这里,powershell可以为您重新编译。 (唯一的缺点是,如果您使用本机Windows PowerShell IDE,则每次更改C#代码时都必须关闭并重新打开以清除会话)
以下是OpenSubtitles API使用XML-RPC.NET和powershell的示例(不是最干净的代码,但希望说明XML-RPC.net的用法):
$source = @'
namespace OpenSubtitlesAPI
{
using CookComputing.XmlRpc;
[XmlRpcUrl("http://api.opensubtitles.org/xml-rpc")]
public interface IOpenSubtitles : IXmlRpcProxy
{
[XmlRpcMethod("LogIn")]
XmlRpcStruct LogIn(string username, string password, string language, string useragent);
[XmlRpcMethod("LogOut")]
XmlRpcStruct LogOut(string token);
[XmlRpcMethod("SearchSubtitles")]
XmlRpcStruct SearchSubtitles(string token, XmlRpcStruct[] queries);
[XmlRpcMethod("SearchSubtitles")]
XmlRpcStruct SearchSubtitles(string token, XmlRpcStruct[] queries, int limit);
}
public class ProxyFactory
{
public static IOpenSubtitles CreateProxy()
{
return XmlRpcProxyGen.Create<IOpenSubtitles>();
}
}
}
'@
# Load XML-RPC.NET and custom interfaces
if ([Type]::GetType("OpenSubtitlesAPI.ProxyFactory") -eq $null)
{
[Reflection.Assembly]::LoadFile("C:\path\to\CookComputing.XmlRpcV2.dll") | Out-Null
$dynamicAssembly = Add-Type -TypeDefinition $source -ReferencedAssemblies ("C:\path\to\CookComputing.XmlRpcV2.dll")
}
# Set up proxy
$proxy = [OpenSubtitlesAPI.ProxyFactory]::CreateProxy()
$proxy.UserAgent = "user agent"
$proxy.EnableCompression = $true
# Log in
$LogInResponse = $proxy.LogIn("user name", "password", "language", "user agent")
# Build query
$query = New-Object CookComputing.XmlRpc.XmlRpcStruct
$query.Add("moviehash", "movie hash")
$query.Add("moviebytesize", "movie size")
$query.Add("sublanguageid", "language")
$queries = @($query)
# Search
$SearchResponse = $proxy.SearchSubtitles($LogInResponse.token, $queries)
# Log out
$LogOutResponse = $proxy.LogOut($LogInResponse.token)
我的回答有点延迟到最初的问题,但希望这可以帮助那些人。
答案 1 :(得分:1)
你看过XML-RPC.NET了吗?您必须在C#中创建一个实现IXmlRpcProxy的XmlRpcProxyGen类,但是一旦完成,您应该能够加载该.NET程序集并使用PowerShell中的代理类。