浅析MetaWeblog

    昨天看dudu老大发布的一篇文章用Windows Live Writer在博客园发布博客,里面提到了MetaWeblog这个东西,可能大家都感觉比较陌生,什么是MetaWeblog,她有什么用处,怎么使用它,这一连串的问题是不是都涌上了你的心头,我下面就替大家解答一下这些问题。
    博客园是基于.Text开发的一套多用户博客系统。.Text提供两个可编程用户接口,SimpleBlogServiceMetablogAPI。SimpleBlogService是一个 .net 的 web service,而MetaBlogAPI是一个XML-RPC Service。她可以让用户远程调用Blog程序提供的接口来完成一些功能,比如发布新的文章,查看最新文章的列表等。
    我们如何利用MetaBlogAPI呢?我们这里要感谢Chuck Cook,他为我们准备了一个可以方便操作XML-RPC的类库。我们下面的内容就是用了XML-RPC类库。我们可以使用三种方法在客户端使用这个类库:
  • 定义一个声明服务器端方法的接口,然后调用XmlRpcProxyGen去产生那个代理类。
  • 手动的写一个调用服务器端方法的类(使用XML-RPC.net,和说起来一样简单)
  • 使用Joe Bork写的XmlRpcProxyCodeGen类去产生代理类。我这里使用这种方法,因为它可以自己写程序动态的产生代码

    那我们要怎么做呢,其实很简单。在XML-RPC.net的代码里面包含了一个简单的MetablogAPI的interface。我们来看一下他,确实很简单,下面展示的只是getRecentPosts方法:

  [XmlRpcMethod("metaWeblog.getRecentPosts",
Description="Retrieves a list of the most recent existing post "
+ "using the metaWeblog API. Returns the metaWeblog struct collection.")]
Post[] getRecentPosts(
string blogid,
string username,
string password,
int numberOfPosts);
  下面把它传给XmlRpcProxyCodeGen类去产生代理类:
// Create a CSharpCodeProvider, since I'd like code in C#
Microsoft.CSharp.CSharpCodeProvider codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
// Ask it for the code gen interface
System.CodeDom.Compiler.ICodeGenerator codeGen = codeProvider.CreateGenerator();
// Setup some options, with a namespace and class name
Headblender.XmlRpc.XmlRpcProxyCodeGenOptions options = new
Headblender.XmlRpc.XmlRpcProxyCodeGenOptions("Community.BlogUtils.BlogApi", "MetaWeblog", false, false);
// Generate the code for the IMetaWeblog interface
string strCode = Headblender.XmlRpc.XmlRpcProxyCodeGen.CreateCode(  typeof(IMetaWeblog), codeGen, options );
// Write out the code to a file. Done!
StreamWriter tw = new StreamWriter("MetaWeblog.cs", false);
tw.Write( strCode );
tw.Close();
    这样就参生了MetaWeblog.cs这个文件,这里面方的是调用服务器方法的类,动态生成,不用自己动手写的哦。给出一点代码片段,让大家看看。
[CookComputing.XmlRpc.XmlRpcMethodAttribute("metaWeblog.getRecentPosts")]
public CookComputing.MetaWeblog.Post[] getRecentPosts(
string blogid, string username, string password, int numberOfPosts)
{
object xrtTemp = null;
CookComputing.MetaWeblog.Post[] xrtReturn = null;
object[] xrtArray = new object[] {
blogid,
username,
password,
numberOfPosts};
xrtTemp = this.Invoke("getRecentPosts", xrtArray);
xrtReturn = ((CookComputing.MetaWeblog.Post[])(xrtTemp));
return xrtReturn;
}
    我给出了调用远程方法的代理类,下面该怎么做你应该很明白吧,写个简易版的Windows Live Writer应该问题不大吧。可能有些朋友还是没有明白如何去指向博客园的MetaWeblogAPI,注意一下XML-RPC里面的[XmlRpcUrl()]你就会明白了。
另外我准备成立一个博客园桌面发布工具的小组,做一个属于博客园自己的writer。有兴趣的朋友可以联系我。
邮箱和MSN为:prolibertine@gmail.com







资源链接:
XML-RPC http://www.xml-rpc.net
XmlRpcProxyCodeGen http://www.cookcomputing.com/blog/archives/000221.html#221

posted on 2006-12-20 18:43 JesseZhao 阅读(2242) 评论(15) 编辑 收藏

评论

#1楼[楼主]  回复 引用 查看   

刚才看了一下,joe有一个新的软件可以产生代理类了,名字为XrpGen,具体说明在http://headblender.com/joe/blog/old/000957.html
2006-12-20 19:01 | 贫嘴老赵      

#2楼  回复 引用 查看   

支持成立一个博客园桌面发布工具开发小组。
2006-12-20 19:52 | dudu      

#3楼  回复 引用 查看   

有webservice了,那为什么还有要这个呢?
2006-12-20 19:52 | Allen Zhang      

#4楼[楼主]  回复 引用 查看   

这个具体什么原因我也不知道,大部分的blog都是用metablogapi,可能这个web service有什么不方便的地方吧,知道个哥们给点解释。
2006-12-20 20:03 | 贫嘴老赵      

#5楼  回复 引用   

请教老赵:我自己也实现了一个基于xml-rpc.net的Metablog api,后来把它扩展成了MovableType api,主要是因为Metablog api不支持自定义的tag。可是,我发现word2007不支持MovableType这个接口,不知道您是否知道该怎么让word2007支持MovableType?

#6楼[楼主]  回复 引用 查看   

对不起,我不了解MovableType api,等待其他兄弟的回答吧
2006-12-20 23:06 | 贫嘴老赵      

#7楼  回复 引用   

@贫嘴老赵
其实很简单啊,只不过扩充了几个方法和属性而已。我想您google一下的话,很快就会了解得:)

#8楼  回复 引用 查看   

@贫嘴老赵
我invoke时出现 “方法并不包含invoke定义”错误,请问你知不知道这是哪里出错了?
2006-12-24 22:31 | Hunts.C      

#9楼  回复 引用 查看   

怎么知道我们的blogid?
2006-12-24 22:41 | Hunts.C      

#10楼[楼主]  回复 引用 查看   

我这里没有出现这个问题,你能把你的代码发过来我看看吗?
2006-12-24 22:48 | 贫嘴老赵      

#11楼[楼主]  回复 引用 查看   

member struct 里面有 blogid 的定义,是一个 string 类型的
2006-12-24 22:51 | 贫嘴老赵      

#12楼  回复 引用 查看   

@贫嘴老赵
我想要getPost,那么参数必须blogid blogname 这两个分别是什么?我想我的name应该是hunts,但是id呢?
2006-12-24 23:00 | Hunts.C      

#13楼  回复 引用 查看   

  public class Test: IMetaWeblog
     {
           [XmlRpcMethodAttribute(
"metaWeblog.getRecentPosts")]
        
public Post[] getRecentPosts( 
            
string blogid, string username, string password, int numberOfPosts)
        
{
            
object xrtTemp = null;
            Post[] xrtReturn 
= null;
            
object[] xrtArray = new object[] { blogid, username, password, numberOfPosts };
            xrtTemp 
= this.Invoke("getRecentPosts", xrtArray);
            xrtReturn 
= (Post[])xrtTemp;
            
return xrtReturn;
        }
     }
    [XmlRpcUrl("http://www.cnblogs.com/hunts/services/metaweblog.aspx")]
    
public interface IMetaWeblog
    
{

        [XmlRpcMethod(
"metaWeblog.getRecentPosts",
           Description 
= "Retrieves a list of the most recent existing post "
           
+ "using the metaWeblog API. Returns the metaWeblog struct collection.")]
        Post[] getRecentPosts(
          
string blogid,
          
string username,
          
string password,
          
int numberOfPosts);
    }
2006-12-24 23:04 | Hunts.C      

#14楼  回复 引用   

这个metablog API简直堪称过度设计的典范,凭良心而论,这种小功能也用得着XML-RPC?
2007-08-12 19:58 | -_-b[未注册用户]

#15楼  回复 引用   

好文章,对此正感兴趣。谢谢
2007-08-17 10:58 | Jans[未注册用户]
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 598482 vUYKYfRcSEM=

导航

公告



=> 稳健 扎实 务实 创新 <=


昵称:JesseZhao
园龄:5年2个月
粉丝:41
关注:28

搜索

 
 

常用链接

我的标签

随笔分类(197)

随笔档案(176)

相册

朋友博客

网站链接

积分与排名

  • 积分 - 338257
  • 排名 - 202

最新评论

阅读排行榜

评论排行榜

推荐排行榜