轉 MetaWeblog API 編寫

現在,許多人都熟悉我的和公司或業界主辦的博客。後者明顯成爲了傳統公司和行業網站的下一代新興產物。博客的內容涉及從簡潔的特製產品公告和公共關係到實用且深入的主題探索,這些主題可能對公司的產品或行業的將來方向相關。php

經常使用縮寫詞

  • API:應用程序編程接口
  • FTP:文件傳輸協議
  • HTTP:超文本傳輸協議
  • IT:信息技術
  • MIME:多媒體 Internet 郵件擴展(Multimedia Internet Mail Extensions)
  • RFC:請求註解(Request for comments)
  • RPC:遠程過程調用
  • RSS:真正簡單的聯合(Really Simple Syndication)
  • SQL:結構化查詢語言
  • URL:統一資源定位符
  • XML:可擴展標記語言

隨着實際提供更新和有用信息的企業和行業博客的成功推出,人們愈來愈注重將博客做爲企業內部的通訊和討論機制。採用博客的組織應該將博客相關任務部署在企業 IT 基礎設施附近,就像任何其餘加強同樣。企業內部博客一般包含與業務相關的討論和信息,必須由組織的 IT 人員管理。選者正確的博客平臺是關鍵的第一步。html

選擇支持開放博客 API 的開放平臺可以爲用戶和管理員帶來顯著的優點。對於用戶,這意味着他們可使用普遍的流行應用程序(從瀏覽器插件到特定於平臺的客戶端應用程序)添加博客文章。對於管理員,支持公共 API 能夠支持使用或開發管理性應用程序。java

有許多標準博客 API 可供使用。在編寫本文時,使用最普遍且支持最普遍的 API 包括:web

  • 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 的最流行的博客軟件包都是開源的,所以能夠在面向內部的企業基礎設施中安裝和使用。流行的選擇包括:apache

  • 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 發佈文件內容

上一個示例頗有趣,但經過發佈單1、簡短的字符串來以博客格式從新實現 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 紅皮書。
相關文章
相關標籤/搜索