转 MetaWeblog API 编写

如今,许多人都熟悉个人和公司或业界主办的博客。后者明显成为了传统公司和行业网站的下一代新兴产物。博客的内容涉及从简洁的特制产品公告和公共关系到实用且深刻的主题探索,这些主题可能对公司的产品或行业的未来方向相关。

常用缩写词

  • API:应用程序编程接口
  • FTP:文件传输协议
  • HTTP:超文本传输协议
  • IT:信息技术
  • MIME:多媒体 Internet 邮件扩展(Multimedia Internet Mail Extensions)
  • RFC:请求注解(Request for comments)
  • RPC:远程过程调用
  • RSS:真正简单的联合(Really Simple Syndication)
  • SQL:结构化查询语言
  • URL:统一资源定位符
  • 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 支持使用任何支持它的软件包发布、检索和编辑博客文章。许多人只是通过博客提供的编辑器在线创建博客文章,而 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> 类型的可能值:authorcategorycommentsdescriptionenclosureguidlinkpubDatesource 和title。这些标准值形成一个广泛流行的博客内容和元数据字典。enclosure 等具有强制属性的 RSS 项通过一种结构来传输,这种结构的成员提供了这些值。对于博客文章,这种结构的 3 个主要成员包括 titlelink 和 description

    newMediaObject 方法支持将一个文件(通常是音频或视频文件)传输到博客服务器。此方法要求您提供的结构包含成员 bits(文件的实际内容,采用 base64 编码格式)、name(在博客服务器上使用的文件名)和 type(文件的 MIME 类型)。

  • numberOfPosts指定要检索的最大博客数量。
  • password指定想要用于验证博客的密码。
  • postid标识想要编辑或检索的特定博客文章。
  • publish指定您希望发布博客文章 (True) 还是将新的/更新的博客文章存储为草稿 (False)。
  • username指定想要用于验证博客的用户名。

metaWeblog 方法返回以下参数:

  • editPost始终返回 True。
  • getCategories返回一个机构体,它标识了每个可用的类别,具有 3 个字符串成员:descriptionhtmlUrl 和 rssUrl
  • getPost返回具有成员的结构体,这些成员也可在以参数形式提供给 newPost 和 editPost 方法的结构体中使用。
  • getRecentPosts返回一个与最近的博客文章对应的结构体数组。数组中的每个结构体包含的成员与调用 getPost 返回的成员相同。
  • newMediaObject返回一个结构体,其中包含一个名为 url 的成员,该成员使用 HTTP 或 FTP 格式提供文件的 URL。
  • newPost返回一个字符串,该字符串可用作对 editPost 或 getPost 的调用中的 blogid
 

MetaWeblog 代码示例

API 的描述非常有趣,但并不涉及到实际实例,这在一些情形中带来了不便,尤其是在该 API 的使用需要使用另一个可能不熟悉的 API 时,比如本例中的 XML-RPC API。后面两节主要介绍如何使用最流行的 MetaWeblog 方法 newPost,以各种方式创建新博客文章。

使用 MetaWeblog 创建简单博客

清单 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);

    }
}

DemoPost.java 和 DemoPostFile.java

要下载示例应用程序 DemoPost.java 和 DemoPostFile.java 的副本,请参见 下载。如果您已在 CLASSPATH 中安装了 Apache XML-RPC 实现的 Java Archive (JAR) 文件,您可以使用 javac 编译此应用程序,然后使用 java 执行它。如果这些 JAR 文件还未安装在您的系统上,您可以从一个 Apache XML-RPC 镜像站点下载它们(参见 参考资料 获取链接)。

主方法中的第一段代码配置 MetaWeblog 使用的 XML-RPC 基础设施,建立到 URL http://wordpress-host/wordpress/xmlrpc.php 的客户端连接,该 URL 是我的示例 WordPress 博客服务器的 XML-RPC URL。不同的博客服务器会使用不同的 XML-RPC URL。可以通过查看您选择的博客服务器的文档,获取您需要的特定 URL。

第二段代码创建一个 hash 映射并使用名称-值对填充它,这些名称-值对提供了创作博客文章所需的信息。设置了 titlelink 和 description 设置的值之后,hash 映射就会与 metaWeblog.newPost 方法需要的其他参数一起打包到一个数组中。

第三段代码使用在第一段代码中创建的 XML-RPC 客户端连接实际调用 metaWeblog.newPost 方法。然后,此代码打印该方法返回的字符串,也就是创建的远程博客文章的 blogid

使用 MetaWeblog 发布文件内容

上一个示例很有趣,但通过发布单一、简短的字符串来以博客格式重新实现 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

 

即装即用的 MetaWeblog 实用工具

上一节 中提供的这种简单实用工具并不适用于所有人:不是所有人都希望构建自己的工具,更不用说从传统命令行执行程序了。运行使用标准 API(比如 MetaWeblog)的博客程序的主要原因包括,可以使用各种不同的应用程序,以不同语言编写,以及在不同的操作系统和环境中执行。许多博客客户端都具有自己的功能和追随者,可以使用它们简化博客文章的创建和发布。

一个最实用的 MetaWeblog 客户端就是 ScribeFire(参见 参考资料),它是一个 Mozilla Firefox 插件,在 Firefox 中提供了功能全面的博客编辑器,简化了博客的发布,甚至支持从其他网页或文档拖放带格式的文本,上传图像等功能。图 1 展示了如何使用 ScribeFire(位于 Firefox 窗口的底部)来将文章发布到 WordPress 博客(位于 Firefox 窗口的顶部)。

图 1. 使用 ScribeFire 向 WordPress 发布文章
使用 ScribeFire 将文本发布到 Wordpress 博客的屏幕截图

MetaWeblog 客户端通常也支持您配置到多个博客的连接,在不同的博客中发布相同的内容。这项功能极大地简化了将博客从内部企业博客传输到外部企业博客的过程。图 2 展示了如何使用 ScribeFire(位于 Firefox 窗口的底部)将 图 1 中显示的相同内容发布到 Pebble 博客(位于 Firefox 窗口的顶部)。

图 2. 使用 ScribeFire 将文章发布到 Pebble
使用 ScribeFire 将文本发布到 Pebble 博客的屏幕截图
 

Pebble:基于开放标准的开放软件

本文中提供和讨论的示例实用工具只是强大的 MetaWeblog 的冰山一角。您可以使用支持 MetaWeblog API 的任何实用工具来与支持该 API 的任何博客服务器通信。您也可以以 MetaWeblog API 为核心来实现博客服务器,Pebble 博客服务器就是这么做的(参见 参考资料)。

Pebble 博客服务器是一个 BSD (Berkeley Software Distribution) 许可的包,基于 MetaWeblog 编写。因为 Pebble 是开源的,所以它的代码可以免费下载,可以提供许多使用各种 MetaWeblog 调用的有用示例。图 3 给出了标准的 Pebble 界面。

图 3. Pebble 欢迎页面
标准的 Pebble 博客欢迎页面截图

Pebble 的一个有趣方面在于,Pebble 服务器上的博客内容存储为 XML 文件,而不是像大部分其他博客服务器那样存储在数据库中。不需要数据库服务器使 Pebble 在系统资源需求方面比其他博客服务器更加轻量,它也简化了备份等任务。博客文章被备份为标准文件系统的一部分,而不需要数据库转储或检查点。

 

结束语

企业博客并不是适用于所有企业信息类型的完美交付机制,但它们奠定了现代企业通信和讨论的基础。在选择企业博客服务器时,传统的考虑因素包括成本、可维护性和实用性。从本文可以看到,您的博客服务器支持的 API 与决策考虑因素同等重要。选择支持 MetaWeblog 等标准 API 的博客服务器可以在博客实用性方面提供显著的长期优势,因为它使人们能够使用许多不同的客户端来向这类中央资源创作和编辑博客文章。这种灵活性常常会决定人们是否使用博客。

 

下载

描述名字大小
简单 MetaWeblog 发布应用程序 DemoPost.java.zip 2KB
发布文件内容的 MetaWeblog 应用程序 DemoPostFile.java.zip 2KB

参考资料

学习

  • MetaWeblog API RFC:阅读最新的 final MetaWeblog RFC 博客文章,这是权威的 MetaWeblog API 资源。
  • General MetaWeblog API:查找关于使用 MetaWeblog API 的信息,包括使用不同编程语言的 MetaWeblog 实现的讨论和示例。
  • XML-RPC.com:查阅关于 XML-RPC、基于规范的 API 和 XML-RPC 工具的一般和详细信息。
  • Blogapps Project:研究此项目及其大量示例程序,这些程序显示了如何使用各种 API 来处理博客。尽管主要专注于 Atom API,此项目也包含使用 MetaWeblog API 的示例。这些示例被用于 Dave Johnson 的优秀图书 RSS and Atom in Action(Manning,2006 年)中,该图书是关于 RSS 和 Atom feed 技术以及 Atom Publishing API 的出色资源。
  • Internet Engineering Task Force (IETF) RFC 5023:查阅 Atom Publishing Protocol 规范。它的衍生产物 Atom Syndication Format(用于 Web feed)在 RFC 4287 中被发布为 IETF 提议的标准。
  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
  • XML 技术库:查阅 developerWorks XML 专区,获取广泛的技术文章和提示、教程、标准和 IBM 红皮书。

posted on 2014-04-30 08:50  荣锋亮  阅读(910)  评论(0编辑  收藏  举报

导航