知识扩充:企业博客、MetaWeblog 和 XML-RPC
知识扩充:企业博客、MetaWeblog 和 XML-RPC
使用 XML 标准和开源工具创建、格式化和发布文档
如今,许多人都熟悉个人和公司或业界主办的博客。后者明显成为了传统公司和行业网站的下一代新兴产物。博客的内容涉及从简洁的特制产品公告和公共关系到实用且深刻的主题探索,这些主题可能对公司的产品或行业的未来方向相关。
随着实际提供更新和有用信息的企业和行业博客的成功推出,人们越来越注重将博客作为企业内部的通信和讨论机制。采用博客的组织应该将博客相关任务部署在企业 IT 基础设施附近,就像任何其他增强一样。企业内部博客通常包含与业务相关的讨论和信息,必须由组织的 IT 人员管理。选者正确的博客平台是关键的第一步。
选择支持开放博客 API 的开放平台能够为用户和管理员带来显著的优势。对于用户,这意味着他们可以使用广泛的流行应用程序(从浏览器插件到特定于平台的客户端应用程序)添加博客文章。对于管理员,支持公共 API 可以支持使用或开发管理性应用程序。
有许多标准博客 API 可供使用。在编写本文时,使用最广泛且支持最广泛的 API 包括:
- Blogger。历史最悠久的博客 API。Blogger 是一个基于 XML-RPC 的接口,最初由 Pyra Labs 为他们的 Blogger 软件创建。第一个版本很快得到了许多其他博客平台的采用,因为它使用 XML 作为数据提交和交换的标准机制,还因为它使用 XML-RPC 标准来支持可以使用 XML-RPC 的任何编程语言的实现。Google 于 2003 年购买了 Blogger,不久之后 Blogger 2.0 API 就出现了 — 它现在成为了一个 Google Data API。
- MetaWeblog。由软件开发人员 Dave Winer 于 2002 年创建,目的在于解决 Blogger 1.0 API 中已发现的限制。MetaWeblog API 是一个基于 XML-RPC 的 API,使用了 RSS Web feed 格式(最流行的就是
<item>
标签)、以结构化数据(而不是 Blogger API 支持的简单字符串)形式查看博客文章等概念。这种集成使开发人员能够使用熟悉的模型创建、提交、管理和查询结构化博客文章。- Atom。这种基于 XML 的 API 也称为 Atom 发布协议(Atom Publishing Protocol),使用 Web 服务而不是 XML-RPC 作为其线级(wire-level)协议,通过利用现有的 HTTP 认证机制实现更强的安全性,支持一些个性的特性,比如使用网页标题中合适的
<link>
标签来发现 API。参见 参考资料 了解关于此协议的更多信息。本文主要介绍 MetaWeblog。
支持 MetaWeblog API 的最流行的博客软件包都是开源的,因此可以在面向内部的企业基础设施中安装和使用。流行的选择包括:
- BLOG:CMS。这个 GNU General Public License (GPL) 包需要 Apache Web Server、PHP 和一个 SQL 数据库,比如 MySQL 或 SQLite。
- Blojsom。这个 Berkeley Software Distribution (BSD) 许可包需要使用 Java™ 语言,一个 JavaServer Pages (JSP) 应用服务器,比如 JBoss、Jetty 或 Apache Tomcat,以及一个 SQL 数据库。
- Drupal。尽管 Drupal 主要用作一个内容管理系统 (CMS),但该 GPL 包也支持 MetaWeblog。Drupal 需要一个 Apache 或 Microsoft® Internet Information Services (IIS) Web 服务器,PHP,以及 MySQL 或 PostgreSQL。对 Microsoft SQL Server 的支持正在开发中。
- Movable Type。这个 GPL 包需要一个 Apache 或 IIS Web 服务器、PHP 和 Perl,以及一个 SQL 数据库。Movable Type 开发社区最近创建了 OpenMelody,这个工具虽然是新兴的,但值得研究。
- Pebble。这个 BSD 许可的包是围绕 MetaWeblog 编写的,需要 Java 语言和一个 JSP 2.0/Servlet 2.4 应用服务器,比如 Tomcat。内容以 XML 格式存储在服务器上,所以不需要数据库。
- Roller。这个 Apache 许可的包来自 Apache Foundation,需要 Java 语言,一个 JSP 2.0/Servlet 2.4 应用服务器(比如 Tomcat)和一个 SQL 数据库。
- WordPress。这个 GPL 包需要 Apache Web 服务器、Perl 和 MySQL。
决定最初使用哪个包取决于您的 Web 基础设施针对的是 Web 服务器还是应用服务器。WordPress 和 Movable Type 能够迅速识别经验丰富的博客作者,BLOG:CMS 和 Drupal 仅需要一个 Web 服务器。Blojsom、Pebble 和 Roller 都是流行的博客包,它们都需要一个应用服务器,但它们的关系数据库需求各不相同(Pebble 不需要关系数据库!)。
MetaWeblog API 支持使用任何支持它的软件包发布、检索和编辑博客文章。许多人只是通过博客提供的编辑器在线创建博客文章,而 MetaWeblog API 支持使用更加丰富的编辑软件,从桌面包到基于浏览器的包,比如 ScribeFire(将在 本文后面的内容中 讨论)。MetaWeblog API 还简化了系统管理对博客文章的备份和归档,简化了在必要时迁移到其他博客包的过程。
该 API 包含比较少的方法。这些方法简化了对该 API 的掌握,它们包括:
- editPost
boolean metaWeblog.editPost(string postid, string username, string password, struct content, boolean publish)- getCategories
struct metaWeblog.getCategories(string blogid, string username, string password)- getPost
struct metaWeblog.getPost(string postid, string username, string password)- getRecentPosts
struct metaWeblog.getRecentPosts(string postid, string username, string password, integer numberOfPosts)- newMediaObject
struct metaWeblog.newMediaObject(string blogid, string username, string password, struct content)- newPost
string Post metaWeblog.newPost(string blogid, string username, string password, struct content, boolean publish)这些方法的参数包括:
blogid
。标识您想要连接到的博客。content
。一种包含博客文章数据的结构。已为此结构定义的成员包括 RSS 2.0 中
<item>
类型的可能值:author
、category
、comments
、description
、enclosure
、guid
、link
、pubDate
、source
和title
。这些标准值形成一个广泛流行的博客内容和元数据字典。enclosure
等具有强制属性的 RSS 项通过一种结构来传输,这种结构的成员提供了这些值。对于博客文章,这种结构的 3 个主要成员包括title
、link
和description
。
newMediaObject
方法支持将一个文件(通常是音频或视频文件)传输到博客服务器。此方法要求您提供的结构包含成员 bits(文件的实际内容,采用 base64 编码格式)、name(在博客服务器上使用的文件名)和 type(文件的 MIME 类型)。numberOfPosts
。指定要检索的最大博客数量。password
。指定想要用于验证博客的密码。postid
。标识想要编辑或检索的特定博客文章。publish
。指定您希望发布博客文章 (True) 还是将新的/更新的博客文章存储为草稿 (False)。username
。指定想要用于验证博客的用户名。
metaWeblog
方法返回以下参数:
editPost
。始终返回 True。getCategories
。返回一个机构体,它标识了每个可用的类别,具有 3 个字符串成员:description
、htmlUrl
和rssUrl
。getPost
。返回具有成员的结构体,这些成员也可在以参数形式提供给newPost
和editPost
方法的结构体中使用。getRecentPosts
。返回一个与最近的博客文章对应的结构体数组。数组中的每个结构体包含的成员与调用getPost
返回的成员相同。newMediaObject
。返回一个结构体,其中包含一个名为url
的成员,该成员使用 HTTP 或 FTP 格式提供文件的 URL。newPost
。返回一个字符串,该字符串可用作对editPost
或getPost
的调用中的blogid
。
API 的描述非常有趣,但并不涉及到实际实例,这在一些情形中带来了不便,尤其是在该 API 的使用需要使用另一个可能不熟悉的 API 时,比如本例中的 XML-RPC API。后面两节主要介绍如何使用最流行的 MetaWeblog 方法
newPost
,以各种方式创建新博客文章。清单 1 中的示例给出了一个非常简单的
metaWeblog.newPost
方法调用。
清单 1. 使用 MetaWeblog 的简单博客
import java.util.*; import java.io.*; import java.net.URL; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class DemoPost { public static void main(String[] args) throws Exception { // Set up XML-RPC connection to server XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL("http://wordpress-host/wordpress/xmlrpc.php")); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); // Set up parameters required by newPost method Map<String, String> post = new HashMap<String, String>(); post.put("title", "Hello, Blog!"); post.put("link", "http://www.vonhagen.org/"); post.put("description", "This is the content of a trivial post."); Object[] params = new Object[]{"1", "admin", "password", post, Boolean.TRUE}; // Call newPost String result = (String) client.execute("metaWeblog.newPost", params); System.out.println(" Created with blogid " + result); } }
主方法中的第一段代码配置 MetaWeblog 使用的 XML-RPC 基础设施,建立到 URL http://wordpress-host/wordpress/xmlrpc.php 的客户端连接,该 URL 是我的示例 WordPress 博客服务器的 XML-RPC URL。不同的博客服务器会使用不同的 XML-RPC URL。可以通过查看您选择的博客服务器的文档,获取您需要的特定 URL。
第二段代码创建一个 hash 映射并使用名称-值对填充它,这些名称-值对提供了创作博客文章所需的信息。设置了
title
、link
和description
设置的值之后,hash 映射就会与metaWeblog.newPost
方法需要的其他参数一起打包到一个数组中。第三段代码使用在第一段代码中创建的 XML-RPC 客户端连接实际调用
metaWeblog.newPost
方法。然后,此代码打印该方法返回的字符串,也就是创建的远程博客文章的blogid
。上一个示例很有趣,但通过发布单一、简短的字符串来以博客格式重新实现 Twitter 可能非常慢。您可能更希望使用您熟悉的文本编辑器创建文件,然后使用自定义标题将该文件发布到博客上。
清单 2 中的示例以 前一个示例 为基础,展示了在
metaWeblog.newPost
方法上的创新,支持您发布文件的内容,而且可以指定文章标题。在执行应用程序时,在命令行上指定这些项。
清单 2. 发布文章内容
import java.util.*; import java.io.*; import java.net.URL; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class DemoPostFile { private static byte[] readFromFile(String src) throws Exception { byte data[]; File file = new File(src); InputStream in = new FileInputStream(src); data = new byte[(int)file.length()]; in.read(data); in.close(); return data; } public static void main(String[] args) throws Exception { String filename = null; String title = "Sample Post From a File"; // Parse and apply command-line args if (args.length > 1) { filename = args[0]; title = args[1]; } else if (args.length == 1) { filename = args[0]; title = "Posted From File: " + filename; } else { System.out.println("Usage: DemoPostFile filename [title] "); return; } // Set up XML-RPC connection to server XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL("http://wordpress-host/wordpress/xmlrpc.php")); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); // Read post from file and set up parameters required // by newPost method String bits = new String(readFromFile(filename)); System.out.println(bits); Map<String, String> post = new HashMap<String, String>(); post.put("title", title); post.put("description", bits); Object[] params = new Object[]{"1", "admin", "password", post, true}; // Call newPost String result = (String) client.execute("metaWeblog.newPost", params); System.out.println(" Created with blogid " + result); } }
此应用程序中的第一个方法是一个
readFromFile
应用程序,它在这里被声明为静态的,以将其与静态主方法的命令行参数解析轻松集成在一起。此应用程序的主方法中的第一段代码初始化两个变量,这两个变量用于包含博客文章的文件名称,应用程序将这两个变量与文章标题一起发布。它然后解析应用程序用于执行调用的参数,确定是否存在文件名和/或标题,并相应做出反应。
接下来的代码初始化到博客服务器的 XML-RPC 客户端连接。后面的代码将在命令行上指定的文章内容读取到一个变量中,并设置使用
metaWeblog.newPost
方法所需的其他变量。最后一段代码调用此方法并打印结果代码,也就是博客服务器上的文章的blogid
。
上一节 中提供的这种简单实用工具并不适用于所有人:不是所有人都希望构建自己的工具,更不用说从传统命令行执行程序了。运行使用标准 API(比如 MetaWeblog)的博客程序的主要原因包括,可以使用各种不同的应用程序,以不同语言编写,以及在不同的操作系统和环境中执行。许多博客客户端都具有自己的功能和追随者,可以使用它们简化博客文章的创建和发布。
一个最实用的 MetaWeblog 客户端就是 ScribeFire(参见 参考资料),它是一个 Mozilla Firefox 插件,在 Firefox 中提供了功能全面的博客编辑器,简化了博客的发布,甚至支持从其他网页或文档拖放带格式的文本,上传图像等功能。图 1 展示了如何使用 ScribeFire(位于 Firefox 窗口的底部)来将文章发布到 WordPress 博客(位于 Firefox 窗口的顶部)。
图 1. 使用 ScribeFire 向 WordPress 发布文章
![]()
MetaWeblog 客户端通常也支持您配置到多个博客的连接,在不同的博客中发布相同的内容。这项功能极大地简化了将博客从内部企业博客传输到外部企业博客的过程。图 2 展示了如何使用 ScribeFire(位于 Firefox 窗口的底部)将 图 1 中显示的相同内容发布到 Pebble 博客(位于 Firefox 窗口的顶部)。
图 2. 使用 ScribeFire 将文章发布到 Pebble
![]()
本文中提供和讨论的示例实用工具只是强大的 MetaWeblog 的冰山一角。您可以使用支持 MetaWeblog API 的任何实用工具来与支持该 API 的任何博客服务器通信。您也可以以 MetaWeblog API 为核心来实现博客服务器,Pebble 博客服务器就是这么做的(参见 参考资料)。
Pebble 博客服务器是一个 BSD (Berkeley Software Distribution) 许可的包,基于 MetaWeblog 编写。因为 Pebble 是开源的,所以它的代码可以免费下载,可以提供许多使用各种 MetaWeblog 调用的有用示例。图 3 给出了标准的 Pebble 界面。
图 3. Pebble 欢迎页面
![]()
Pebble 的一个有趣方面在于,Pebble 服务器上的博客内容存储为 XML 文件,而不是像大部分其他博客服务器那样存储在数据库中。不需要数据库服务器使 Pebble 在系统资源需求方面比其他博客服务器更加轻量,它也简化了备份等任务。博客文章被备份为标准文件系统的一部分,而不需要数据库转储或检查点。
企业博客并不是适用于所有企业信息类型的完美交付机制,但它们奠定了现代企业通信和讨论的基础。在选择企业博客服务器时,传统的考虑因素包括成本、可维护性和实用性。从本文可以看到,您的博客服务器支持的 API 与决策考虑因素同等重要。选择支持 MetaWeblog 等标准 API 的博客服务器可以在博客实用性方面提供显著的长期优势,因为它使人们能够使用许多不同的客户端来向这类中央资源创作和编辑博客文章。这种灵活性常常会决定人们是否使用博客。