【转】基于XML-RPC的BloggerAPI学习
BloggerAPI是一套程序接口,用以支持遠程操作blog.這個規范現在的版本是1.0,是個試驗版本和α版本。但是,規范的研發人員不再對BloggerAPI進一步地開發,他們正在制定一套新的、更穩定的API,新項目的名稱為echo
.
雖然如此,了解一下這個bloggerAPI還是非常有意義的。一方面有很多語言提供了實現包,另一方面很blog工具也提供了相應的包,如MT。需要說明的是,BloggerAPI提供的功能太有限了,只定義了6個方法或函數,所以出了一個RFC叫 MetaWeblog API,對其進行了擴展。我看了一下,MT2.6.4就支持MetaWeblogAPI.
下面對二者進行簡單地介紹,以后有機會,再跟echo比較一下。:)
BloggerAPI based on XML-RPC
1、方法列表
| 方法 | 說明 |
| blogger.newPost | 向批定的blog增加新的文章(post),通常會在增加后即發布。 |
| blogger.editPost | 編輯一篇文章(post),通常會在修改后發布。 |
| blogger.getUsersBlogs | 返回一個成員的所有文章的信息。 |
| blogger.getUserInfo | 鑒證一個用戶并反回其信息(如userid,email等) |
| blogger.getTemplate | 返回指定的blog的主要或文檔索引模板 |
| blogger.setTemplate | 編輯指定的blog的主要或文檔索引模板 |
2、blogger.newPost
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| blogid (string) | 這個post即將發送到的blog的標志 |
| username (string) | 有權post文章的用戶名 |
| password (string) | 用戶密碼 |
| content (string) | Post的內容 |
| publish (boolean) | 是否發布 |
示例:
請求XML-RPC調用的數據
POST /api/RPC2 HTTP/1.0
User-Agent: Java.Net Wa-Wa 2.0
Host: plant.blogger.com
Content-Type: text/xml
Content-length: 515
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.newPost</methodName>
<params>
<param><value><string>C6CE3FFB3174106584CBB250C0B0519BF4E294</string></value></param>
<param><value><string>744145</string></value></param>
<param><value><string>ewilliams</string></value></param>
<param><value><string>secret</string></value></param>
<param><value><string>Today I had a peanut butter and pickle sandwich
for lunch. Do you like peanut-butter and pickle sandwiches? I do.
They're yummy. Please comment!</string></value></param>
<param><value><boolean>false</boolean></value></param>
</params>
</methodCall>
成功時的應答
HTTP/1.1 200 OK
Connection: close
Content-Length: 125
Content-Type: text/xml
Date: Mon, 6 Aug 20001 19:55:08 GMT
Server: Java.Net Wa-Wa/Linux
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>4515151</string></value>
</param>
</params>
</methodResponse>
失敗時的應答
錯誤信息通過XML-RPC <methodResponse>及<fault> 項返回,包含著的 <struct> 有錯誤碼和描述,這是由xml-rpc規范定義.
HTTP/1.1 200 OK
Connection: close
Content-Length: 225
Content-Type: text/xml
Date: Mon, 6 Aug 20001 19:55:08 GMT
Server: Java.Net Wa-Wa/Linux
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>java.lang.Exception: java.lang.Exception: Error: AppKey is
invalid or inactive.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
3、blogger.editPost
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| postid (string) | 某篇post的唯一標志 |
| username (string) | 有權修改文章的用戶名(作者或管理員) |
| password (string) | 用戶密碼 |
| content (string) | Post的內容 |
| publish (boolean) | 是否發布 |
4、blogger.getUserBlogs
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| username (string) | 用戶名 |
| password (string) | 用戶密碼 |
成功應答示例
HTTP/1.1 200 OK
Connection: close
Content-Length: 125
Content-Type: text/xml
Date: Mon, 6 Aug 20001 19:55:08 GMT
Server: Java.Net Wa-Wa/Linux
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>url</name>
<value>http://stuff.foo.com/biz</value>
</member>
<member>
<name>blogid</name>
<value>2997323</value>
</member>
<member>
<name>blogName</name>
<value>Blogger Biz Dev</value>
</member>
</struct>
</value>
<value>
<struct>
<member>
<name>url</name>
<value>http://www.blogger.com/</value>
</member>
<member>
<name>blogid</name>
<value>2723</value>
</member>
<member>
<name>blogName</name>
<value>Blogger News</value>
</member>
</struct>
<value>
<struct>
<member>
<name>url</name>
<value>http://www.geocities.com/rafting/</value>
</member>
<member>
<name>blogid</name>
<value>223723</value>
</member>
<member>
<name>blogName</name>
<value>RaftingBlog</value>
</member>
</struct>
</value>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
5、blogger.getUserInfo
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| username (string) | 用戶名 |
| password (string) | 用戶密碼 |
成功應答示例 HTTP/1.1 200 OK
Connection: close
Content-Length: 125
Content-Type: text/xml
Date: Mon, 6 Aug 20001 19:55:08 GMT
Server: Java.Net Wa-Wa/Linux
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>nickname</name>
<value>Ev.</value>
</member>
<member>
<name>userid</name>
<value>1</value>
</member>
<member>
<name>url</name>
<value>http://www.evhead.com</value>
</member>
<member>
<name>email</name>
<value>ev@pyra.com</value>
</member>
<member>
<name>lastname</name>
<value>Williams</value>
</member>
<member>
<name>firstname</name>
<value>Evan</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
6、blogger.getTemplate
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| blogid (string) | 這個post即將發送到的blog的標志 |
| username (string) | 有權post文章的用戶名 |
| password (string) | 用戶密碼 |
| templateType (string) | 指定返回哪個模板,目前只能是 "main" 或 "archiveIndex". |
成功時的應答,....表示此處內容被我省略。
<?xml version="1.0" encoding="ISO-8859-1"?<<methodResponse<<params<<param<<value<<HTML<
<HEAD<
<TITLE<<$BlogTitle$<: <$BlogDescription$<</TITLE<
</BODY<
</HTML<
</value<</param<</params<</methodResponse<
7、blogger.setTemplate
參數說明
| 參數 | 說明 |
| appkey (string) | 發送這個post的程序的唯一標志 |
| blogid (string) | 這個post即將發送到的blog的標志 |
| username (string) | 有權post文章的用戶名 |
| password (string) | 用戶密碼 |
| template (string) | 模板文本(通常是HTML).必須包含 和標簽,因它們需要發布。 (?我的mainindex里沒有啊) |
| templateType (string) | 指定返回哪個模板,目前只能是 "main" 或 "archiveIndex". |
請求格式示例
POST /api/RPC2 HTTP/1.0
User-Agent: Java.Net Wa-Wa 2.0
Host: plant.blogger.com
Content-Type: text/xml
Content-length: 515
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.setTemplate</methodName>
<params>
<param><value><string>C6CE3FFB3174106584CBB250C0B0519BF4E294</string></value></param>
<param><value><string>744154</string></value></param>
<param><value><string>ewilliams</string></value></param>
<param><value><string>secret</string></value></param>
<param><value><string><html><head><title><$BlogTitle$></title></head><body><Blogger><BlogDateHeader><h1><$BlogDateHeaderDate$></h1></BlogDateHeader><$BlogItemBody$><br></Blogger></body></html></string></value></param>
<param><value><string>main</string></value></param>
</params>
</methodCall>
MetaWeblog API
這個rfc的最新發布是在08/26/2003.
1、什么是MetaWeblog API
MetaWeblog API (MWA)是一套編程接口,允許外面的程序能取得和設置blog文章的文本或屬性。它基于流行的XML-RPC通信協議,后者在很多的流行的開發環境中都有了實現的包。
2、MetaWeblog API與Blogger API 的關系
MetaWeblog API是對Blogger API增強, Blogger API只能取得或設置blog文章的文本內容(hedong問,能取得嗎?).在2002年春天MWA面世,在此以前許多blog工具能存儲許多擴展數據,但不能訪問或編輯這些數據,因為沒有一個通過的API。
到2003年夏天,在本文的寫作期間,大部分流行的blog工具和編輯器,能同時支持Blogger API 和MetaWeblog API.
3、MetaWeblog API和 RSS 2.0 的關系
MetaWeblog API利用XML-RPC來描述一篇blog文章. 我們使用了RSS2.0中對一個項的術語來描述一篇blog文章的元數據,而不是重新發明一套。請參照RSS2.0中對文章的title, link 、description,author, comments, enclosure, guid等的定義或命名。 更進一步,由于RSS2.0是可擴展的,因而MetaWeblog API也是可擴展的. 我們在MWA中設計了一些用以表述屬性和命名空間的約定。
4、基本函數(entry-points)
1)metaWeblog.newPost (blogid, username, password, struct, publish) returns string
2)metaWeblog.editPost (postid, username, password, struct, publish) returns true
3)metaWeblog.getPost (postid, username, password) returns struct
blogid, username, password 和publish參數的含義同 Blogger API. newPost返回的字符串表示post_id,同Blogger API定義的一樣. 而那個struct就是MWA的精華所在。
5、數據結構
在newPost和editPost中,內容信息不再跟BloggerAPI中那是一個字符串,而是一個數據結構。這個數據結構的成員,就是rss2.0中定義的ITEM的元素。參見后面附表。
當一個元素有屬性時,用一個數據結構(屬性做成員)傳遞屬性及其相應的值。如enclosure元素,用一個包含url, length 和type的結構傳遞屬性。
對source元素,數據結構的成員為url 和name,前者為source的屬性后者為source值。
對categories元素,傳遞一個字符串數組。在服務器端,如果傳來的category不存在,則忽略不報錯,且只保存有效的那些category.(hedong,好象沒說domain屬性的事啊)
服務器必須忽略所有不能理解的元素。
在調用 metaWeblog.newPost 或 metaWeblog.editPost時,如果數據結構中含有一個名叫flNotOnHomePage的 boolean 值,則主頁不顯示此文章而只在分類中顯示。
6、其它函數
1)metaWeblog.newMediaObject (blogid, username, password, struct) returns struct
參數的struct,至少包含name, type and bits三個元素。
name是個字符串,可以用來作存儲對象的文件名或用于對象列表的顯示。它決定weblog如何引用這個對象。如果name和weblog已有一個對象重名,則替換掉已有的對象。
type是個字符串,表示對象的類型,必須是個標準的MIME類型,如 audio/mpeg or image/jpeg or video/quicktime.
bits是個base64-編碼的二進制值,包含著對象的內容。
這個結構可以含有其它的元素,這些元素可以或不能被內容管理系統保存.
當調用失敗時,拋出error.當成功時,返回的strcut中,至少要有一個元素url,用以指明這個對象如何被訪問。其值只能是一個HTTP url或FTP url.
2)metaWeblog.getCategories (blogid, username, password) returns struct
返回的struct中,為每個分類提供一個子結構,子結構中至少包含三個元素:description, httpurl 和 rssurl.
3)metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) returns array of structs
返回是一個結構數組,盛放著最新發布的文章信息。每個結構的內容同metaWeblog.getPost返回內容相同.
numberOfPosts指明要取回的按發布時間倒序計數的文章數量,當值超過總文章數時,返回全部文章信息。
7、傳送帶屬性的元素
除了enclosure和source元素有專門規定外,其它元素按下列規則處理:
1)如果一個元素有屬性,則用一個struct來表示,各屬性為struct的子元素。
2)如果一個元素同時有屬性和值,則用一個一個struct來表示,各屬性為struct的子元素,再增加一個叫_value的子元素,表示元素的值。這也就要求,元素的屬性名不能為_value.
8、傳送某命名空間的元素
RSS 2.0允許使用命名空間. 如果你要傳送的元素是一個命名空間的一部分,那就在傳遞給 newPost 或 editPost 的struct中增加一個子struct,以指明命名空間的URL為名,以要傳送的元素值為子元素。
9、說明
在MWA中不要明確要求傳送appkey值,如果應用程序要傳送appkey,則在struct中增加一個名為appkey的元素,并賦之以相關的值。
附表:RSS2.0中ITEM的元素列表
| 元素(Element) | 描述(Description) | 例子(Example) | 重要性 | 屬性 |
| title | 項(item)的標題 | Venice Film Festival Tries to Quit Sinking | 必備 | |
| link | 項的URL | http://www.nytimes.com/2002/09/07/movies/07FEST.html | 必備 | |
| description | 項的大綱 | Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged. | 必備 | |
| author | 該項作者的email | oprah@oxygen.net | 可選 | |
| category | 包含該項的一個或幾個分類(catogory) | Simpsons Characters | 可選 | domain可選,指分類法的URL |
| comments | 該項的評論(comments)頁的URL | http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290 | 可選 | |
| enclosure | 描述該附帶的媒體對象 | 可選 | url/length/type皆必備,type須是標準MIME類型 | |
| guid | 項的唯一標志符串 | http://inessential.com/2002/09/01.php#a2 | 可選 | isPermaLink可選,默認為真,指明guid是否為一永久URL。 |
| pubDate | 項的發布時間 | Sun, 19 May 2002 15:21:36 GMT | 可選 | |
| source | 該項來自的RSS道 | Quotes of the Day | 可選 | Url必備 |
附:MWAAPI清單
總結
以上是生活随笔為你收集整理的【转】基于XML-RPC的BloggerAPI学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到自己打小狗是什么意思
- 下一篇: asp.net)js 在当前日期上加一天