博客客户端如何实现
像我们这种基本没接触过Web开发的人,可能完全没有思路去实现一个博客客户端。事实上
实现起来非常简单。
使用过其他博客客户端(例如Windows Live writer)的人肯定知道metaweblog API,在配
置客户端的时候需要填入。例如CPPBLOG的这个地址就是
http://www.cppblog.com/kevinlynx/services/metaweblog.aspx。这个页面展示了一些API
说明。这些API就是博客客户端和服务器进行操作通信的接口。意思是说,服务器端提供这
这些接口,我们的客户端调用这些接口即可。例如:
blogger.deletePost,调用该接口即可删除一篇博客文章
但是客户端如何调用到这个接口呢?这需要通过一种新的技术(或者说标准),即 xml rpc
。rpc大家应该清楚,xml rpc其实说白了, 就是把接口调用的细则塞进 http
请求发给web服务器,服务器接收请求完成操作后再把结果以http回应的形式丢给客户端,
即完成了一次接口调用 。
至于http请求回应的细则就不提了,无非就是一些特殊格式的数据,通过tcp连接与服务器
交互这些数据。
所以,基本上,整个过程还是非常简单。如何来将调用细节塞进http请求,则是以xml rpc
标准来做,其格式正好是xml格式。举个例子吧:
title_or_id
当然这部分数据之前就是若干http请求的数据。服务器回应也是以xml格式组织:
Welcome to Zope.org
我们的博客客户端所要做的,就是把这些博客发布相关的操作封装起来提供给使用者。底层
实现主要包括http请求、xml-rpc的组织等。何况,这两部分在各个语言里都有大量的库存
在,lisp自然也有。
我这里直接选取了lisp的一个xml-rpc库:s-xml-rpc,基本上百来行代码就可以把各个功
能跑一遍。例如以下lisp代码就实现了通过s-xml-rpc删除CPPBLOG的一篇文章:
(defun delete-post (postid)
(rpc-call
"blogger.deletePost"
postid
"kevinlynx"
"password"
t))
发布博客也很简单,根据metaweblog API接口的说明,发布博客时需要填充一个结构体。但
主要涉及到的数据仅包括:文章内容、文章标题、文章分类(可选):
(defun new-post (title context &optional (cates))
(rpc-call
"metaWeblog.newPost"
""
"kevinlynx"
"password"
(new-post-struct title context cates)
t))
值得注意的是,如果文章中有贴图,则需要事先将图片文件上传到服务器。CPPBLOG的
metaweblog API里恰有API提供:
(defun new-media-object (filename)
(rpc-call
"metaWeblog.newMediaObject"
""
"kevinlynx"
"password"
(new-media-object-struct filename)))
该函数读入图片文件,然后调用metaWeblog.newMediaObject接口,即可完成上传。上传成
功后,服务器会返回该图片的URL。然后在我们的文章中就可以使用该图片了。