65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (4投票s)

2006 年 10 月 9 日

3分钟阅读

viewsIcon

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 包的链接,其中包含大量示例和文档。使用此包,您只需添加几个属性(XMLRpcServiceXmlRpcMethod)即可轻松地为类添加 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.getUsersBlogsblogger.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 期望接收一个结构数组。

在定义完所有方法并添加基本功能后,我发现 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 日:初次发布
© . All rights reserved.