结合社会媒体 API 和基于 XML 的数据格式

针对使用 XML 方言的社会媒体供应商 API 编程

探秘与社会媒体站点交互相关的概念、设计和实现,这些社会媒体站点使用各种 API 和基于 XML 的数据格式,比如 Really Simple Syndication (RSS)、Atom、Facebook Markup Language (FBML)、OpenSocial Markup Language (OSML)、SOAP 和 plain old XML (POX)。

J. Jeffrey Hanson, 首席架构师, Max International

Jeff HansonJeff Hanson 有着 20 多年的软件行业从业经验,担任过 Microsoft Windows port OpenDoc 项目的高级工程师、Novell 的 Route 66 架构的主管架构师以及 eReinsure.com, Inc. 的首席架构师,指导了基于 J2EE 的再保险系统框架和平台的设计和实现。Jeff 目前是 Max Software, Inc. 的 CTO,他在指导为 Internet 安全和家长控制(parental controls)软件提供桌面和企业应用程序和平台。Jeff 写作了大量的文章和书籍,包括 .NET versus J2EE Web Services: A Comparison of ApproachesPro JMX: Java Management ExtensionsWeb Services Business Strategies and Architectures


developerWorks 投稿作者

2010 年 1 月 12 日

本文面向致力于理解社会媒体环境和如何跨各种 API 应用基于 XML 的数据格式的开发人员。很多开发人员对这一点感兴趣,其原因是基于 XML 的数据遍布各种社会媒体 API。基于 XML 的数据格式有助于标准化和简化跨各种异构站点和服务的 HTTP 编程模型。

社会媒体简介

术语社会媒体 指的是允许用户共享媒介、内容、数据等的站点和服务。有些社会媒体站点和服务众所周知,比如 LinkedIn、Facebook、Twitter 和 MySpace,Google 还提供了大量类似的站点和服务。新闻媒体也正在快速转变为社会媒体提供模型。

常用缩略词

  • API:应用程序编程接口
  • HTML:超文本标记语言
  • HTTP:超文本传输协议
  • URI:统一资源标识符
  • URL:统一资源定位符
  • XML:可扩展标记语言

社会媒体提供工具包括在线论坛、网页博客、wiki、图像共享、视频共享、在线书签和社交活动流。

XML 在社会媒体社区中的数据交换中扮演重要角色。社会媒体供应商在它们提供的用于促进对它们的服务的访问的 API 中广泛使用基于 XML 的方言。


基于 XML 的数据格式简介

XML 是一种基于文本的标记语言,用于组织具有多种不同方言的数据的结构。XML 方言通过可以被嵌入到一个关联 XML 文档的模式定义。多数常用编程语言提供对创建、更新和解析 XML 文档的支持。

基于 XML 的方言应用于广泛的 Web 服务中。Web 服务中更常用的一些方言包括 POX、RSS、Atom 和 SOAP。其他新出现的方言也广受欢迎。表 1 列示并描述了 Web 服务中一些更常用的、基于 XML 的方言。

表 1. Web 服务中常用的、基于 XML 的方言
方言说明
SOAP

SOAP 最初代表 Simple Object Access Protocol,但它现在不再是一个首字母缩略词。SOAP 是一个基于 XML 的协议规范,用于在 Web 服务上下文中交换结构化数据。它最初设计用于 Remote Procedure Call (RPC) 和面向文档的消息交换。随着用于定义其格式、交换模式、传输级别绑定等特性的其他规范的引入,SOA 的复杂程度也逐渐增加。这种复杂性阻碍了服务供应商和社会媒体供应商对它的广泛采用。

RSSRSS 代表 Really Simple Syndication 或 Rich Site Summary,它是一种基于 XML 的方言,用于组织各种 Web 提要(如博客、新闻和其他在线数据源)提供的数据的结构。RSS 文档允许发布者以一种标准和迅速的方式聚合内容。RSS 客户使用计算机桌面上、浏览器中或来自一个移动设备的应用程序,以特定的间隔从 RSS 站点自动检索更新。RSS 客户通过在给定的 RSS 阅读器应用程序中输入提要的地址来订阅 RSS 提要。
AtomAtom Syndication Format 是用于 Web 提要的一种基于 XML 的方言,其使用方式与 RSS 类似。Atom 提要比 RSS 更综合一些,原因是每个 Atom 元素可以包含图像、指向内容的外部链接、元数据等。
FBMLFBML 代表 Facebook Markup Language,它是 Facebook 提供的一个 HTML 子集,用于允许应用程序开发人员构建在 Facebook 服务器上运行的 HTML 站点。
OST 和 OSMLOpenSocial Template (OST) 和 OpenSocial Markup Language (OSML) 是由 Google 等 OpenSocial 网络成员定义的基于 XML 的方言,用于支持开发人员构建遵循行业推荐标准并在 OpenSocial 兼容的容器中运行的社会媒体应用程序和站点。OST 和 OSML 鼓励数据驱动的应用程序和服务开发,同时推动标记和编程逻辑之间的明确分离。

将 XML 数据格式应用到社会媒体 API

社会媒体 API 是由社会媒体供应商提供的请求/响应交互框架,用于支持第三方站点构建与社会媒体供应商的功能交互的站点、页面和服务等。eBay、Amazon、Google、Facebook、Twitter 和 OpenSocial 是几个为构建社交媒体应用程序和服务提供 API 的供应商。下面展示这些基于 XML 的 API 的一些简单示例。


eBay

eBay 提供的 API 允许开发人员提交项目并在 eBay 上列示,检索 eBay 类别的当前列表,查看关于在 eBay 上列示的项目的信息,检索项目的高竞价人信息,检索一个给定用户正在出售的项目的列表,检索一个给定用户已经出价的项目的列表,显示其他站点上的 eBay 列表,以及留下关于卖家的反馈。

检索作为 XML 文档的基本用户信息

清单 1 是一个 HTTP 请求示例,该请求检索一个 eBay 用户的作为 XML 文档的默认/基本信息。

清单 1. eBay GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=XML
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID

清单 2 展示可以使用 HTTP POST 传输的 XML 格式的相同请求。

清单 2. 作为 XML 的 eBay GetUserProfile
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <UserID>johndoesUserID</UserID>
</GetUserProfileRequest>

检索 XML 文档形式的扩展用户信息

为便于检索关于给定用户的其他信息,eBay API 提供了 IncludeSelector 参数。

清单 3 是检索给定用户的详细信息的 HTTP GET 请求的 URL 格式示例。

清单 3. 带有细节的 eBay GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=XML
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID
   &IncludeSelector=Details

清单 4 是可以使用 HTTP POST 传输的 XML 格式的相同的详细用户信息请求。

清单 4. 带有细节的 XML 格式的 eBay GetUserProfile
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <UserID>hypothetical-user</UserID>
  <IncludeSelector>Details</IncludeSelector>
</GetUserProfileRequest>

清单 5 展示了使用 清单 3清单 4 中展示的请求检索时返回的一个典型响应示例。这个响应包含关于该用户的详细信息。

清单 5. eBay GetUserProfile 响应
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2007-11-09T21:05:05.781Z</Timestamp> 
  <Ack>Success</Ack> 
  <Build>e525_core_APILW_5028523_R1</Build> 
  <Version>525</Version> 
  <User>
    <FeedbackScore>1054</FeedbackScore> 
    <FeedbackPrivate>false</FeedbackPrivate> 
    <FeedbackRatingStar>Red</FeedbackRatingStar> 
    <NewUser>false</NewUser> 
    <RegistrationDate>2005-11-01T20:50:00.000Z</RegistrationDate> 
    <RegistrationSite>US</RegistrationSite> 
    <Status>Confirmed</Status> 
    <SellerBusinessType>Undefined</SellerBusinessType> 
    <UserID>johndoesUserID</UserID> 
    <StoreURL>http://stores.ebay.com/johndoesStore</StoreURL> 
    <StoreName>John Doe's Store</StoreName> 
    <SellerItemsURL>
      http://search.ebay.com/_W0LMsarsrjohndoesUserIDQQhtZ-1
    </SellerItemsURL> 
    <AboutMeURL>http://members.ebay.com/aboutme/johndoesUserID</AboutMeURL> 
    <MyWorldURL>http://myworld.ebay.com/johndoesUserID</MyWorldURL> 
    <MyWorldSmallImage>
      http://i2.ebayimg.ebay.com/01/u/000/00/23/animage.JPG?set_id=34
    </MyWorldSmallImage> 
    <MyWorldLargeImage>
      http://i2.ebayimg.ebay.com/01/u/000/77/23/anotherimage.JPG?set_id=34
    </MyWorldLargeImage> 
    <ReviewsAndGuideURL>
      http://search.reviews.us.ebay.com/members/johndoesUserID
    </ReviewsAndGuideURL> 
    <FeedbackDetailsURL>
      http://feedback.ebay.com?ViewFeedback&userid=johndoesUserID&...
    </FeedbackDetailsURL> 
  </User>
</GetUserProfileResponse>

检索作为 SOAP 信封的基本用户信息

清单 6 展示了检索作为一个 SOAP 请求提供的基本用户信息的 eBay API HTTP 请求示例。

清单 6. 请求 SOAP 响应的 eBay GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=SOAP
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID
   &IncludeSelector=Details

清单 7 展示了对 SOAP 信封形式的详细用户信息的相同 eBay API 请求。

清单 7. SOAP 信封形式的 eBay GetUserProfile 请求
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
      <UserID>johndoesUserID</UserID>
      <IncludeSelector>Details</IncludeSelector>
    </GetUserProfileRequest>
  </soapenv:Body>
</soapenv:Envelope>

清单 8 展示了作为 SOAP 信封返回的详细用户信息响应。

清单 8. eBay GetUserProfile SOAP 响应
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <GetUserProfileResponse xmlns="urn:ebay:apis:eBLBaseComponents">
      <Timestamp>2009-11-09T20:01:05.781Z</Timestamp> 
      <Ack>Success</Ack> 
      <Build>e525_core_APILW_5028523_R1</Build> 
      <Version>525</Version> 
      <User>
        <FeedbackScore>1047</FeedbackScore> 
        <FeedbackPrivate>false</FeedbackPrivate> 
        <FeedbackRatingStar>Red</FeedbackRatingStar> 
        <NewUser>false</NewUser> 
        <RegistrationDate>2009-10-12T10:10:00.000Z</RegistrationDate> 
        <RegistrationSite>US</RegistrationSite> 
        <Status>Confirmed</Status> 
        <SellerBusinessType>Undefined</SellerBusinessType> 
        <UserID>johndoesUserID</UserID> 
        <StoreURL>http://stores.ebay.com/johndoesStore</StoreURL> 
        <StoreName>John Does Store</StoreName> 
        <SellerItemsURL>
          http://search.ebay.com/_W0LMsarsrjohndoesUserIDQQhtZ-1
        </SellerItemsURL> 
        <AboutMeURL>http://members.ebay.com/aboutme/johndoesUserID</AboutMeURL>
        <MyWorldURL>http://myworld.ebay.com/johndoesUserID</MyWorldURL> 
        <MyWorldSmallImage>
          http://i2.ebayimg.ebay.com/01/u/000/00/23/animage.JPG?set_id=23
        </MyWorldSmallImage> 
        <MyWorldLargeImage>
          http://i2.ebayimg.ebay.com/01/u/000/77/23/anotherimage.JPG?set_id=23
        </MyWorldLargeImage> 
        <ReviewsAndGuideURL>
          http://search.reviews.us.ebay.com/members/johndoesUserID
        </ReviewsAndGuideURL> 
        <FeedbackDetailsURL>
          http://feedback.ebay.com/ws?ViewFeedback&userid=johndoesUserID&...
        </FeedbackDetailsURL> 
      </User>
    </GetUserProfileResponse>
  </soapenv:Body>
</soapenv:Envelope>

Amazon

Amazon 提供几个 Web 服务 API — 为方便起见称为 Amazon Web Services — 来交付其功能,以便访问 Amazon 的服务基础设施。这些服务包括(但不仅限于)在 表 2 中列示和描述的服务。

表 2. 一些 Amazon Web 服务
服务说明
Elastic Compute Cloud (EC2)在云中提供可调整大小的计算能力的 Web 服务
Simple Storage Service (S3)可用于在任何时间、从 Web 上的任意位置存储并检索大量数据的简单 Web 服务接口
CloudFront用于内容交付的 Web 服务
SimpleDB用于在云中的结构化数据上运行查询的 Web 服务
Simple Queue Service (SQS)用于在分布式应用程序之间移动消息的云托管的队列
E-Commerce Service (ECS)提供创建集成 ECS 和其他 Amazon 服务的 Web 站点和应用程序的设施,以便检索产品数据、来自客户的内容、卖家信息、产品列表、购物车等信息

检索 XML 文档形式的公共用户信息

以下示例使用 Amazon ECS 服务来检索关于一个给定客户的公共信息。这个 API 要求每个请求使用一个请求签名验证。这个请求签名通过使用一个 Amazon Web Service 秘密密匙对请求的类型、域、URI 和该请求中的每个参数的一个排序字符串进行基本的 Base64 编码而创建。

清单 9 一个 Amazon ECS API 请求的典型签名请求示例。

清单 9. Amazon CustomerContentSearch 请求
http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=johndoesAccessKeyID
&AssociateTag=johndoesAssociateID
&Operation=CustomerContentSearch
&Name=Jane%20Doe

您可以通过以下步骤创建清单 9 中的签名请求:

  1. 将时间戳附加到这个 URL:
    http://ecs.amazonaws.com/onca/xml?
    Service=AWSECommerceService
    &AWSAccessKeyId=johndoesAccessKeyID
    &AssociateTag=johnDoesAssociateID
    &Operation=CustomerContentSearch
    &Name=Jane%20Doe
  2. 对请求进行 URL 编码。

    对一个请求进行 URL 编码意味着通过将非 URL 兼容字符转换为 URL 兼容字符来将请求字符串转换为有效的 URL 格式。多数编程语言拥有完成这个任务的标准库和/或函数。关于 URL 编码的完整说明,请参见 参考资料

  3. 提取查询参数并删除与字符(&):
    Service=AWSECommerceService
    AWSAccessKeyId=johndoesAccessKeyID
    AssociateTag=johnDoesAssociateID
    Operation=CustomerContentSearch
    Name=Jane%20Doe
  4. 按照 ASCII 字节值对查询参数排序:
    AssociateTag=johnDoesAssociateID
    AWSAccessKeyId=johndoesAccessKeyID
    Name=Jane%20Doe
    Operation=CustomerContentSearch
    Service=AWSECommerceService
  5. 用与字符(&)重新连接排序后的查询参数列表。结果是一个规范字符串:
    AssociateTag=johnDoesAssociateID
    &AWSAccessKeyId=johndoesAccessKeyID
    &Name=Jane%20Doe
    &Operation=CustomerContentSearch
    &Service=AWSECommerceService
  6. 使用分行符将请求类型头部附加到这个规范字符串的前面:
    GET
    ecs.amazonaws.com
    /onca/xml

将要执行签名的字符串看起来类似于 清单 10

清单 10. Amazon CustomerContentSearch 签名字符串
GET
ecs.amazonaws.com
/onca/xml
AssociateTag=johnDoesAssociateID
&AWSAccessKeyId=johndoesAccessKeyID
&Name=Jane%20Doe
&Operation=CustomerContentSearch
&Service=AWSECommerceService

HMAC 和 SHA-256

Hash-based Message Authentication Code (HMAC) 是一种联合使用散列函数和秘密密匙的消息验证加密机制。

Secure Hash Algorithm 256 (SHA-256) 是一个 32 位加密散列函数,用于在消息验证中验证数据块的真实性。

要了解更多信息,请参见 参考资料

现在,使用 SHA-256 和您的 Amazon Secret Access Key 从 清单 10 中的字符串创建一个 Request for Comments (RFC) 2104-compliant HMAC 代码。签名后的字符串类似于 清单 11

清单 11. Amazon CustomerContentSearch 签名字符串
Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=

现在,URL 对签名编码,如 清单 12 所示。

清单 12. Amazon CustomerContentSearch 已签名和已编码字符串
Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D

然后,这个经过 URL 编码的签名被附加到 API 请求的 URL 后面,如 清单 13 所示。

清单 13. 带有签名的 Amazon CustomerContentSearch 请求
http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
   &AWSAccessKeyId=johndoesAccessKeyID
   &AssociateTag=johnDoesAssociateID
   &Name=Jane%20Doe
   &Operation=CustomerContentSearch

CustomerContentSearch 检索的信息量通过请求中指定的响应组和客户提供的数据决定。清单 14 是包含一个完整 XML 客户数据的典型响应。

清单 14. Amazon CustomerContentSearch XML 响应
<CustomerContentSearchResponse
  xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value="Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) 
AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0"></Header>
    </HTTPHeaders>
    <RequestId>0RXAHS524460FBBFDMGJ</RequestId>
    <Arguments>
      <Argument Name="Service" Value="AWSECommerceService"></Argument>
      <Argument Name="Name" Value="Jane Doe"></Argument>
      <Argument Name="Operation" Value="CustomerContentSearch"></Argument>
      <Argument Name="AssociateTag" Value="johnDoesAssociateID"></Argument>
      <Argument Name="Signature" 
Value="SOWM2hnR8zF5b9tyXQEsO0oG0crM7rbSwy1QL7UDfT0="></Argument>
      <Argument Name="AWSAccessKeyId" Value="johndoesAccessKeyID"></Argument>
    </Arguments>
    <RequestProcessingTime>0.104732990264893</RequestProcessingTime>
  </OperationRequest>
  <Customers>
    <Request>
      <IsValid>True</IsValid>
      <CustomerContentSearchRequest>
        <Name>Jane Doe</Name>
      </CustomerContentSearchRequest>
    </Request>
    <TotalResults>1</TotalResults>
    <TotalPages>1</TotalPages>
    <Customer>
      <CustomerId>janedoesCustomerID</CustomerId>
    </Customer>
  </Customers>
</CustomerContentSearchResponse>

检索作为 SOAP 信封的公共用户信息

Amazon SOAP 请求根据地区和请求是否在一个安全的连接上进行来指定端点。表 3 中列示的 SOAP 端点可用于 Amazon Product Advertising API SOAP 请求。

表 3. Amazon Web Services SOAP 端点
地区端点
CAhttp://ecs.amazonaws.ca/onca/soap
https://aws.amazonaws.ca/onca/soap
DEhttp://ecs.amazonaws.de/onca/soap
https://aws.amazonaws.de/onca/soap
FRhttp://ecs.amazonaws.fr/onca/soap
https://aws.amazonaws.fr/onca/soap
JPhttp://ecs.amazonaws.jp/onca/soap
https://aws.amazonaws.jp/onca/soap
UKhttp://ecs.amazonaws.co.uk/onca/soap
https://aws.amazonaws.co.uk/onca/soap
UShttp://ecs.amazonaws.com/onca/soap
https://aws.amazonaws.com/onca/soap

清单 15 展示了传递到对 Amazon ItemSearch 操作的调用的 SAOP 信封示例。

清单 15. 作为 SOAP 的 Amazon CustomerContentSearch 响应
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ItemSearch xmlns="http://ecs.amazonaws.com/AWSECSCommerce/onca/soap">
      <AWSAccessKeyId>johndoesAccessKeyID</AWSAccessKeyId>
      <Request>
        <SearchIndex>Books</SearchIndex>
        <Keywords>Lord%20of%20the%20Rings</Keywords>
      </Request>
    </ItemSearch>
  </soapenv:Body>
</soapenv:Envelope>

Google

Google 提供了广泛的通过 Web 服务 API 启用的在线服务。多数这些 API 使用一种基于 XML 的请求/响应格式支持。Google Apps 就是一个在 Google 基础设施范围内支持基于 XML 的交互的 Google 服务示例。

验证 API 请求

许多 Google 服务在交换信息之前要求对访问进行授权。在 API 中使用的一种机制称为 ClientLogin API。经过 ClientLogin API 授权的访问涉及到一个 Google 签发的、可以在所有后续请求中使用的令牌。

清单 16 展示了向 Google 请求一个 ClientLogin 令牌的请求。

清单 16. Google ClientLogin 请求
https://www.google.com/accounts/ClientLogin?
accountType=HOSTED_OR_GOOGLE
&Email=johndoe@example.com
&Passwd=foobar
&service=apps
&source=mytestapp

清单 16 中的请求的成功响应类似于 清单 17

清单 17. Google ClientLogin 响应
SID=ABCDE...
LSID= ABCDE...
Auth= ABCDE...

针对本文的目的,您可以忽略清单 17 中展示的两个代码:SIDLSID。但是,Auth 值是您可以在后续 Google API 请求中使用的验证令牌。

安全的 API 请求要求 Authorization 头部使用来自一个成功的 ClientLogin 响应的令牌设置,如 清单 18 所示。

清单 18. 安全的 Google 请求的 Google 授权头部
Authorization: GoogleLogin auth=ABCDE...

检索作为 Atom 提要的用户个人信息

cURL

cURL 是一个使用 URL 语法执行在线请求的命令行工具,它支持 FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS 等协议。cURL 还支持 SSL 证书、HTTP POST、HTTP PUT、FTP 上传、基于 HTTP 格式的上传、代理、cookie 以及用户+密码验证等。

Google Apps 在一个 profile 提要中提供用户概况信息。您可以使用一个 profile 提要来查看并修改与 Google Apps 帐户关联的用户个人信息。profile 提要使用 Profiles Data API 检索。

清单 19 展示了一个用于检索 Google Apps 用户 johndoe@example.com 的个人信息的标准 HTTP GET 请求的示例。该请求作为一个 cURL 命令行传输,并传送一个此前检索到的验证令牌。

清单 19. Google 检索用户 profile 提要请求
curl -k --header "Authorization: GoogleLogin auth=ABCDE..." \
https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe

这个前导的 cURL 命令包括从一个此前的成功 ClientLogin 请求返回的 Auth 令牌。当这个命令成功执行后,应该返回一个类似于 清单 20 中的示例的 Atom 条目。

清单 20. Google 检索用户 profile Atom 提要响应
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom'
       xmlns:apps='http://schemas.google.com/apps/2006'
       xmlns:gd='http://schemas.google.com/g/2005'>
  <id>https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe</id>
  <updated>1970-01-01T00:00:00.000Z</updated>
  <category
    scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/apps/2006#user'/>
  <title type='text'>John Doe</title>
  <link
    rel='self'
    type='application/atom+xml'
    href='https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe'/>
  <link
    rel='edit'
    type='application/atom+xml'
    href='https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe'/>
  <apps:login
    userName='johndoe'
    suspended='false'
    ipWhitelisted='false'
    admin='true'
    changePasswordAtNextLogin='false'
    agreedToTerms='true'/>
  <apps:quota limit='7168'/>
  <apps:name familyName='Doe' givenName='John'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.nicknames'
    href='https://apps-
apis.google.com/a/feeds/example.com/nickname/2.0?username=johndoe'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.emailLists'
    href='https://apps-
apis.google.com/a/feeds/example.com/emailList/2.0?recipient=johndoe%example.com'/>
</entry>

检索 RSS 提要形式的用户个人信息

您可以参数化许多 Google API 以返回 RSS 格式的结果,这通常需要在输入请求上设置一个参数。

要使用 cURL 检索 RSS 形式的相同的 johndoe@example.com 用户个人信息,执行 清单 21 中的命令行。

清单 21. Google 检索用户 profile RSS 提要请求
curl -k --header "Authorization: GoogleLogin auth=ABCDE..." \
https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe?alt=rss

在上述 cURL 命令成功执行后,一个类似于 清单 22 的 RSS 条目将作为响应返回。

清单 22. Google 检索用户 profile RSS 提要响应
<?xml version='1.0' encoding='UTF-8'?>
<item xmlns:atom='http://www.w3.org/2005/Atom'
      xmlns:apps='http://schemas.google.com/apps/2006'
      xmlns:gd='http://schemas.google.com/g/2005'>
  <guid isPermaLink='false'>
    https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe
  </guid>
  <atom:updated>1970-01-01T00:00:00.000Z</atom:updated>
  <category domain='http://schemas.google.com/g/2005#kind'>
    http://schemas.google.com/apps/2006#user
  </category>
  <title>John Doe</title>
  <apps:login
    userName='johndoe'
    suspended='false'
    ipWhitelisted='false'
    admin='true'
    changePasswordAtNextLogin='false'
    agreedToTerms='true'/>
  <apps:quota limit='7168'/>
  <apps:name familyName='Doe' givenName='John'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.nicknames'
    href='https://apps-
apis.google.com/a/feeds/example.com/nickname/2.0?username=johndoe'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.emailLists'
    href='https://apps-
apis.google.com/a/feeds/example.com/emailList/2.0?recipient=johndoe%40example.com'/>
</item>

Facebook

Facebook 发布了 Facebook Platform 来支持开发人员创建允许用户共享信息并保持连接的应用程序。在 Facebook 上运行的应用程序可以使用此前在 表 1 中描述的 FBML 标记语言来构造。

使用 FBML 的登录按钮页面

Facebook 提供 FBML 作为一种构建与 Facebook 服务和数据进行交互的页面的机制。清单 23 中的启用了 FBML 的页面构造了一个登录按钮,用于对要登录到 Facebook 平台的用户进行验证。您可以将这个按钮嵌入到任何 HTML 页面中。

清单 23. 启用 FBML 的页面
<html>
<head>
<title>test</title>
</head>
<body>
<script
src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US"
type="text/javascript">
</script>
<script type="text/javascript">
  FB.init("ff60291faf5de5c350fab4d4cc84b9cb");
</script>
 
 <fb:login-button length="short" size="medium"></fb:login-button>
 <br/>
 <fb:profile-pic uid="loggedinuser" size="square" facebook-logo="true">
 </fb:profile-pic>
 <br/> 
 <fb:name uid="loggedinuser" useyou="false" linked="true"></fb:profile-pic>
 <br/> 
 <div id="profile_pics"></div>
<script type="text/javascript">
var widget_div = document.getElementById("profile_pics");
FB.ensureInit(function () {
  FB.Facebook.get_sessionState().waitUntilReady(function() {
  FB.Facebook.apiClient.friends_get(null, function(result) {
    var markup = "";
    var num_friends = result ? Math.min(5, result.length) : 0;
    if (num_friends > 0) {
      for (var i=0; i<num_friends; i++) {
        markup += 
          '<fb:profile-pic
             size="square"
             uid="'+result[i]+'"
             facebook-logo="true"></fb:profile-pic>';
      }
    }
    widget_div.innerHTML = markup;
    FB.XFBML.Host.parseDomElement(widget_div);
  });
  });
});
</script>
</body>
</html>

用于解析清单 23 中的 FBML 表单的响应在 图 1 中展示。

图 1. 用 FBML 呈现的响应
展示 Facebook 登录按钮页面的用 FBML 呈现的响应的屏幕截图

使用 XFBML 的登录按钮页面

Facebook 提供了 XFBML 作为 FBML 的一个子集,用于允许将基于 FBML 的页面整合到一个 HTML 页面中,以便使用 Facebook Connect 或在一个内嵌框架(iframe)中使用 FBML。

清单 24 构建了一个用于对要登录到 Facebook Connect 平台的用户进行验证的登录按钮。您可以将这个按钮嵌入到任何 HTML 页面中。

清单 24. 支持 XFBML 的页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>test</title>
</head>
<body>
 <script 
src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" 
type="text/javascript"></script>
 <fb:login-button></fb:login-button>
 <script type="text/javascript">  FB.init("ff60291faf5de5c350fab4d4cc84b9cb", 
"xd_receiver.htm"); </script>
</body>
</html>

用于解析清单 24 中的 XFBML 表单的响应在 图 2 中展示。

图 2. 用 XFBML 呈现的响应
展示 Facebook 登录按钮的用 XFBML 呈现的响应的屏幕截图

Twitter

REST

Representational State Transfer (REST) 是一个用于分布式系统的软件架构和会话模型。术语 Representational State Transfer(具象状态传输)是 Roy Fielding(Hypertext Transfer Protocol 1.0 版和 1.1 版的作者之一)在他的博士论文中首次定义并引入的。参见 参考资料 获取更多信息。

Twitter 正在 Web 上流行,这在很大程度上归功于 Twitter 可以通过其 API 轻松向开发人员提供其服务。Twitter 的 API 基于 REST,可以返回 XML、JavaScript Serialized Object Notation (JSON)、RSS 和 Atom 提要格式的结果。

检索 RSS 提要形式的 Twitter 公共时间表

Twitter 允许您检索多种格式的 API 响应,其中包括 RSS。清单 25 展示了一个 Twitter API 请求,该请求使用 cURL 命令行从 Twitter 检索 RSS 提要形式的公共时间表(timeline)。

清单 25. Twitter 公共时间表请求
curl http://twitter.com/statuses/public_timeline.rss

在上述 cURL 命令成功执行后,一个类似于 清单 26 中的示例的 RSS 提要将作为响应返回。

清单 26. Twitter 公共时间表响应
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Twitter public timeline</title>
    <link>http://twitter.com/public_timeline</link>
    <atom:link type="application/rss+xml" 
href="http://twitter.com/statuses/public_timeline.rss" rel="self"/>
    <description>Twitter updates from everyone!</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>Here is a tweet title</title>
    <description>Here is a tweet description</description>
    <pubDate>Tue, 10 Nov 2009 18:28:16 +0000</pubDate>
    <guid>http://twitter.com/astrogerly/statuses/1234567890</guid>
    <link>http://twitter.com/astrogerly/statuses/1234567890</link>
  </item>
  <item>
    <title>Here is another tweet title</title>
    <description>Here is another tweet description</description>
    <pubDate>Tue, 9 Nov 2009 14:32:11 +0000</pubDate>
    <guid>http://twitter.com/astrogerly/statuses/6789012345</guid>
    <link>http://twitter.com/astrogerly/statuses/6789012345</link>
  </item>
  ...
  </channel>
</rss>

检索 XML 形式的好友时间表

如果需要,Twitter API 可以返回格式为 plain old XML 的结果。可以通过在请求 URL 的末尾添加 xml 来实现这一点。

某些 API 在可以被访问之前要求验证,验证方法是在请求中包含一个简单的 “用户名/密码” 对。

要使用 cURL 检索一个给定用户的 Twitter 好友的 XML 形式的时间表,执行 清单 27 中的命令。

清单 27. Twitter 好友的时间表请求
curl -u johndoe:johndoespassword http://twitter.com/statuses/friends_timeline.xml

注意 清单 27 的命令行中用于该 API 的 username:password 对。

在上述 cURL 命令成功执行后,一个类似于 清单 28 中的示例的 XML 文档将作为响应返回。

清单 28. Twitter 好友的时间表响应
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
  <status>
    <created_at>Tue Nov 10 16:50:40 +0000 2009</created_at>
    <id>1234567890</id>
    <text>Tweet shown here</text>
    <source>web</source>
    <user>
      <id>7654321</id>
      <name>atwitterusername</name>
      <screen_name>atwitterscreenname</screen_name>
      <location>Worldwide...</location>
      <description>User description</description>
      ...
    </user>
  </status>
  <status>
    <created_at>Tue Nov 9 14:33:22 +0000 2009</created_at>
    <id>1234567890</id>
    <text>Another tweet shown here</text>
    <source>web</source>
    <user>
      <id>1234567</id>
      <name>anothertwitterusername</name>
      <screen_name>anothertwitterscreenname</screen_name>
      <location>Worldwide...</location>
      <description>Another user description</description>
      ...
    </user>
  </status>
  ...
</statuses>

检索作为 Atom 提要的 Twitter 公共时间表

Twitter API 还可以返回 Atom 格式的结果。同样,您可以通过在请求 URL 的末尾添加 “atom” 来实现这一点,如 清单 29 的 cURL 命令行所示。

清单 29. 作为 Atom 提要的 Twitter 公共时间表请求
curl http://twitter.com/statuses/public_timeline.atom

在上述 cURL 命令成功执行后,一个类似于 清单 30 中的示例的 Atom 提要将作为响应返回。

清单 30. 作为 Atom 提要返回的 Twitter 公共时间表响应
<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Twitter public timeline</title>
  <id>tag:twitter.com,2007:Status</id>
  <link type="text/html"
        href="http://twitter.com/public_timeline"
        rel="alternate"/>
  <link type="application/atom+xml"
        href="http://twitter.com/statuses/public_timeline.atom"
        rel="self"/>
  <updated>2009-11-10T18:48:25+00:00</updated>
  <subtitle>Twitter updates from everyone!</subtitle>
    <entry>
      <title>username: @Here is a tweet</title>
      <content type="html">username: @Here is a tweet</content>
      <id>
        tag:twitter.com,2007:http://twitter.com/username/statuses/1234567890
      </id>
      <published>2009-11-10T18:48:25+00:00</published>
      <updated>2009-11-10T18:48:25+00:00</updated>
      <link type="text/html"
            href="http://twitter.com/username/statuses/1234567890"
            rel="alternate"/>
      <link type="image/jpeg"
            href="http://a3.twimg.com/profile_images/1234567890/userimage.JPG"
            rel="image"/>
      <author>
        <name>User Name</name>
      </author>
    </entry>
    <entry>
      <title>anotherusername: @Here is another tweet</title>
      <content type="html">anotherusername: @Here is another tweet</content>
      <id>
        tag:twitter.com,2007:http://twitter.com/anotherusername/statuses/6789012345
      </id>
      <published>2009-11-09T16:42:15+00:00</published>
      <updated>2009-11-09T16:42:15+00:00</updated>
      <link type="text/html"
            href="http://twitter.com/anotherusername/statuses/6789012345"
            rel="alternate"/>
      <link type="image/jpeg"
            href="http://a3.twimg.com/profile_images/6789012345/userimage.JPG"
            rel="image"/>
      <author>
        <name>Anotheruser Name</name>
      </author>
    </entry>
</feed>

OpenSocial

OpenSocial 是一个组织联盟(包括 Google、MySpace 等),致力于为构建社会媒体应用程序和服务定义公共 API 和标记语言。OpenSocial 联盟定义的主要标记语言是 OpenSocial Markup Language (OSML) 和 OpenSocial Template (OST)。

使用 OST 进行声明性标记

OST 是一种针对小工具开发人员设计的声明性标记语言,用于支持他们创建用于构建数据驱动的应用程序和站点的可重用模板。OST 实现在抵达客户机的浏览器之前解析并执行 OST 代码,这个过程允许数据在浏览器中呈现之前对其进行检索、存储和注入等操作。

在 OST 中使用 OSML

OSML 定义一组标记,每个 OpenSocial 兼容的容器都能解析并呈现该标记。OST 页面中的 OSML 标记用于检索诸如用户个人信息、好友列表之类的数据。

使用 OST/OSML 检索用户的好友

清单 31 中的 OST/OSML 小工具示例展示了如何使用 OSML PeopleRequest 标记来检索一个用户的好友。userId 属性 userIdgroupId 指定检索哪个好友列表。然后,OST 容器在页面执行时呈现该好友列表。

清单 31. OpenSocial OST/OSML 小工具
<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs title="Server-side Template">
    <Require feature="opensocial-data" />
    <Require feature="opensocial-templates">
    </Require>
  </ModulePrefs>
  <Content type="html">
    <![CDATA[      
      <script xmlns:os="http://ns.opensocial.org/2008/markup" type="text/os-data">
        <os:PeopleRequest key="friends" userId="@viewer" groupId="@friends"/>
      </script>
 
      <script type="text/os-template">
        <ul>
          <li repeat="${friends}">
            <span id="id${Context.Index}">${Cur.name.givenName}</span>
          </li>
        </ul>
     </script>
    ]]>
  </Content>
</Module>

结束语

社会媒体正迅速成为允许用户共享内容和媒体等资源的新一波科技、技术和 API 浪潮,您肯定不会对这一新浪潮无动于衷。社会媒体正在 LinkedIn、Facebook、Twitter 以及 Google 提供的众多站点和服务上流行起来。

在本文中,我们探讨了与使用各种 API 和基于 XML 的数据格式(如 RSS、Atom、FBML、OSML、SOAP 和 simple XML)的社会媒体站点进行交互相关的概念、设计和实现。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source
ArticleID=461107
ArticleTitle=结合社会媒体 API 和基于 XML 的数据格式
publish-date=01122010