具有 MetaWeblog API 支持的编码博客引擎,并与 Windows Live Writer 一起使用






4.14/5 (4投票s)
2006 年 10 月 9 日
3分钟阅读

65700
描述了 MetaWeblog API 接口以及如何创建支持 MetaWeblog API 的自定义博客引擎。
引言
在本文中,我想介绍 MetaWeblog
API,稍后将分享一些使用 Windows Live Writer 的 C# 示例。在发现 Windows Live Writer 支持此 API 后,我开始考虑编写支持 MetaWeblog
API 的自定义博客引擎。
什么是 Windows Live Writer?
它是 Microsoft 的一款程序,允许您向大多数主流博客引擎发布文章。

什么是 MetaWeblog API?
MetaWeblog
API (MWA) 是一个编程接口,允许外部程序获取和设置博客文章的文本和属性。它基于流行的 XML-RPC 通信协议。
什么是 XML-RPC?
它是一种远程过程调用,使用 HTTP 作为传输协议,XML 作为编码方式。XML-RPC 设计得尽可能简单,同时允许传输、处理和返回复杂的数据结构。
首先,我想简要介绍一下 XML-RPC 及其 C# 实现。在 XML-RPC 实现页面上,我找到了 Charles Cook 的 XML-RPC.NET 包的链接,其中包含大量示例和文档。使用此包,您只需添加几个属性(XMLRpcService
、XmlRpcMethod
)即可轻松地为类添加 XML-RPC 支持。下面是一个带有 XML-RPC 支持的 blogger 类的示例:
[XmlRpcService(
Name = "blogger",
Description = "This is a sample XML-RPC service illustrating method
calls with simple parameters and return type.",
AutoDocumentation = true)]
[XmlRpcUrl("http://www.gtrifonov.com/MetaBlogApi.ashx")]
public class blogger : XmlRpcService
{
[XmlRpcMethod("metaWeblog.newPost")]
public string newPost(string blogid, string username,
string password, XmlRpcStruct rpcstruct, bool publish)
{
}
}
您会注意到,newPost
方法使用 XmlRpcStruct
类型的参数。此类型代表 XML-RPC 的 struct
数据类型。在 XML-RPC 中,有几种简单的数据类型、数组数据类型以及 XML-RPC struct
数据类型,它基本上是字典的简单表示。
MetaWeblog API 接口
MetaWeblog
API 接口包含以下方法:
-
metaWeblog.newPost (blogid, username, password, struct, publish) returns string
添加新帖子
-
metaWeblog.editPost (postid, username, password, struct, publish) returns true
编辑现有帖子
-
metaWeblog.getPost (postid, username, password) returns struct
返回现有帖子
-
metaWeblog.getCategories (blogid, username, password) returns struct
返回博客分类
-
metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) returns array of structs
返回最近的帖子
-
metaWeblog.newMediaObject (blogid, username, password, struct) returns struct
向帖子添加新的媒体对象
在我开始编写和测试此接口时,我发现 Windows Live Writer 调用了 blogger.getUsersBlogs
和 blogger.deletePost
方法,这些方法实际上是在 Blogger
API 中定义的。我在我的 blogger 类中定义了这些方法以及相应的 XmlRPcMethod
属性,并开始编写代码:下面是我的 blogger
类的骨架。
using System;
using System.Web;
using CookComputing.XmlRpc;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.Collections.Generic;
using System.IO;
[XmlRpcService(
Name = "blogger",
Description = "This is a sample XML-RPC service illustrating method
calls with simple parameters and return type.",
AutoDocumentation = true)]
[XmlRpcUrl("http://www.gtrifonov.com/MetaBlogApi.ashx")]
public class blogger : XmlRpcService
{
[XmlRpcMethod("blogger.getUsersBlogs")]
public XmlRpcStruct[] getUsersBlogs(string appKey, string username, string password)
{
....
return struct;
}
[XmlRpcMethod("metaWeblog.setTemplate")]
public bool setTemplate(string appKey, string blogid,
string username, string password, string template, string templateType)
{
return true;
}
[XmlRpcMethod("metaWeblog.getCategories")]
public XmlRpcStruct[] getCategories(string blogid, string username, string password)
{
XmlRpcStruct rpcstruct = new XmlRpcStruct();
rpcstruct.Add("description", "description");
rpcstruct.Add("categoryid", "123");
rpcstruct.Add("title", "title");
return new XmlRpcStruct[] { rpcstruct };
}
[XmlRpcMethod("metaWeblog.getRecentPosts")]
public XmlRpcStruct[] getRecentPosts(string blogid,
string username, string password,int numberOfPosts)
{
XmlRpcStruct[] posts = new XmlRpcStruct[iterator.Count];
.......
return posts;
}
[XmlRpcMethod("metaWeblog.getTemplate")]
public string getTemplate(string appKey, string blogid,
string username, string password, string templateType)
{
.....................
return id;
}
[XmlRpcMethod("metaWeblog.editPost")]
public bool editPost(string postid, string username,
string password, XmlRpcStruct rpcstruct, bool publish)
{
..................
return true;
}
[XmlRpcMethod("metaWeblog.getPost")]
public XmlRpcStruct getPost(string postid, string username, string password)
{
..................
return rpcstruct;
}
[XmlRpcMethod("blogger.deletePost")]
public bool deletePost(string appKey, string postid,
string username, string password, bool publish)
{
return false;
}
[XmlRpcMethod("metaWeblog.newMediaObject")]
public XmlRpcStruct newMediaObject(string blogid,
string username, string password, XmlRpcStruct rpcstruct)
{
return struct;
}
}
问题
在定义完所有方法并添加基本功能后,我发现 Windows Live Writer 没有使用 getTemplate
和 setTemplate
方法,而是通过连接到博客站点并下载内容来尝试检测您的博客外观。这很奇怪,因为这些方法就是为此设计的。
我还发现,在 XML-RPC RFS 文档中,getRecentPosts
方法返回一个包含帖子数组的 struct
,但 Windows Live Writer 期望接收一个结构数组。
getTemplate
和 setTemplate
方法,而是通过连接到博客站点并下载内容来尝试检测您的博客外观。这很奇怪,因为这些方法就是为此设计的。我还发现,在 XML-RPC RFS 文档中,getRecentPosts
方法返回一个包含帖子数组的 struct
,但 Windows Live Writer 期望接收一个结构数组。
如果您只查看 RFS 而尝试编写 getCategories
方法,它将无法与 Windows Live Writer 配合使用,因为 writer 期望 categoryid
作为结构成员之一。感谢 Wiktor 的 帖子,其中列出了以下响应代码示例:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>categoryid</name>
<value>1</value>
</member>
<member>
<name>title</name>
<value>Category 1</value>
</member>
<member>
<name>description</name>
<value>Description </value>
</member>
</struct>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
我希望关于模板方法的这些问题能在未来的 Windows Live Writer 测试版中得到解决。
参考文献
C# 源代码
您可以通过访问我的网站 此处找到 C# 实现的源代码(使用 XML 文件作为 RSS 存储)。
为什么我没有将它们包含在本篇文章中?我定期更新一些内容。将来,我希望发布一个带有 XML 存储提供程序的 RSS 引擎,让拥有低端托管计划的用户能够将其用作快速博客发帖解决方案。
本文最初发布在 George Trifonov Blog。
历史
- 2006 年 10 月 9 日:初次发布