REST笔记(三):一种标准的超媒体格式:Atom

  前面一节中讲述了REST架构风格中最核心本的要素之一:超媒体格式。虽然超媒体格式有很有用,如能被浏览器很好解析的HTML。但是HTML也不是万能的。如我们在AJAX应用中,使用JSON表述格式很显然比HTML要好。再者,我们为了实现某一特定领域而采用自定义的超媒体格式,如果消费者只需要处理表述中的一小部分,虽然我们可以通过获取资源的表述,然后过滤出我们需要处理的资源,但这显然不是一种好的方式。Atom社区所制定了一条深受欢迎的惯例。

目录:
  1、Atom简介
  2、Atom1.0与RSS2.0
  3、Atom中基本概念介绍
  4、Atom中的链接关系
  5、.Net FCL中对Atom的实现
  6、Atom的用途

  1、Atom简介
Atom:Atom联合格式(Atom Syndication Format)的简称。它是 一种基于XML的超媒体格式。它提供了灵活可扩展的互操作的格式,并且因为基于XML的特点,所以它为跨平台的应用间传递数据提供了很好的支持。是IETF的“建议标准”。Atom作为一种流行的超媒体格式已经被Google等广泛使用。下图为一Atom格式实例:

  

  2、Atom1.0与RSS2.0
说起Atom可能有点陌生,但是对RSS都应该比较熟悉。Atom的出现弥补了RSS中的一些不足。维基百科中叙述如下:
  1、RSS 2.0 可能包含文本或经过编码的HTML内容,同时却没有提供明确的区分办法;相比之下,Atom 则提供了明确的标签(也就是typed)。
  2、RSS 2.0 的 description 标签可以包含全文或摘要(尽管该标签的英文含义为描述或摘要)。Atom 则分别提供了 summary 和 content标签,用以区分摘要和内容,同时 Atom 允许在summary中添加非文本内容。
  3、RSS 2.0 存在多种非标准形式的应用,而 Atom 具有统一的标准,这便于内容的聚合和发现。
  4、Atom 有符合XML标准的命名空间,RSS 2.0 却没有。
  5、Atom 通过XML内置的xml:base标签来指示相对地址(URI),RSS 2.0 则无相应的机制区分相对地址和绝对地址。
  6、Atom 通过XML内置的xml:lang,而 RSS 采用自己的language标签。
  7、Atom 强制为每个条目设定唯一的ID,这将便于内容的跟踪和更新。
  8、Atom 1.0 允许条目单独成为文档,RSS 2.0 则只支持完整的种子文档,这可能产生不必要的复杂性和带宽消耗。
  9、Atom 按照RFC 3339标准(ISO 8601标准的一个子集)表示时间 ,而RSS 2.0 中没有指定统一的时间格式。
  10、Atom 1.0 具有在 IANA 注册了的 MIME 类型,而 RSS 2.0 所使用的 application/rss+xml 并未注册。
  11、Atom 1.0 标准包括一个 XML schema,RSS 2.0 却没有。
  12、Atom 是IETF组织标准化程序下的一个开放的发展中标准,RSS 2.0 则不属于任何标准化组织,而且它不是开放版权的。

  3、Atom中基本概念介绍
  3.1 提要(feed)
  Atom通过列表来表示数据称之为提要(feed).它的部分元数据说明:
  id:在提要生命周期中永久的、唯一的标识符
  title:提要为我们提供的可读标题
  subTitle:为提要的源信息
  category:提要分类。由其term属性的Value指定。此外有两个可选属性:Label、Scheme,前者表示我们可以理解的表述,后者标识了此分类所属方案
  updated:提要最新更新时间
  link:获取提要的URI
  有关提要的详细信息,可以查阅MSDN

  3.2 条目(entry)
  条目(entry)是构成提要(feed)的带有时间戳数据实体。一个提要中包含一个或多个条目。虽然条目(entry)一般都是包含在提要(feed)中,但是他们都可以单独作为可寻址的资源来被消费者使用。如下即为一个Atom提要:不管是提要(feed)还是条目(entry),都有一个通用唯一标识符:uuid(Universally Unique Indentifier)。
  条目(entry)中与提要(feed)相同的部分就不多做介绍了,由于它们是一种标准的格式,所以代表的意义也大同小异。但条目(entry)有提要(feed)所没有的content元素,用它来设置条目内容。

  4、Atom中的链接关系
  link是Atom中主要的超媒体控件,通过它就可以获取资源的表述,供消费者使用。link有几个重要的属性:
  1、rel:描述链接关系以及链接语义的上下文
  2、href:获取资源表述的URI
  3、type:资源可能的媒体类型
  虽然link中有type属性,服务端返回给客户端的响应的HTTP 头信息中也有Content-Type信息。无论怎样Content-Type信息始终是服务端返回给客户端最权威的表述格式。但link中有type属性依然有意义。例如:如果服务端返回给客户端的表述中既有XML,也有JSON格式,那客户端可以根据自身需要,选择适当的URI来获取资源的表述类型。


link控件的几种链接关系:
  self:当前提要或条目所需的资源由href所标识的URI获取
  via:标识当前提要或条目的信息来源
  alternate:连接当前提要或条目的替代表述的链接
  enclosure:表述URI获取表述的资源的尺寸可能会比较大
  related:表示href所指资源同当前提要或题目存在某种关系
  per-archive:当前提要以前最近的一个提要。
  next-archive:与per-archive相反。
实际应用中,如果某个客户端掉线,等网络恢复后,它获取到最新的提要,并且能通过提要中的超媒体控件link 的per-archive链接关系一直往前遍历,从而寻找到它最近一次处理过的提要信息;同时也能通过next-archive来往后遍历,遍历到最新的提要信息。这些链接关系值都是在IANA的链接关系注册表中注册的,已经成为一种标准的处理方式。

  5、.Net FCL中对Atom的实现
  在.Net FCL(FrameWork Class Library)中,我们可以使用在System.ServiceModel程序集的System.ServiceModel.Syndication命名空间中找到项目Atom相关的类,来创建我们的应用。主要的类有SyndicationFeed,SyndicationItem,SyndicationContent、Atom10FeedFormatter等。我们通过SyndicationFeed来创建提要(feed),通过SyndicationItem来创建条目(entry)。范例如下:

SyndicationFeed feed = new SyndicationFeed
{
  Title = new TextSyndicationContent("feed Tile"),
  LastUpdatedTime = new DateTimeOffset(DateTime.Now),
  Description = new TextSyndicationContent("feed Description Content")
};
feed.Authors.Add(new SyndicationPerson("aa@gmial.com", "zhanshan", "cnblogs.com"));
feed.Language = "us-en";
feed.Generator = "test feed";
feed.Links.Add(new SyndicationLink(new Uri("http://www.cnblogs.com/tyb1222"), "via", "linkTitle", "application/Atom+xml",1000));
feed.Categories.Add(new SyndicationCategory("blog"));
feed.Contributors.Add(new SyndicationPerson("aa@gmial.com", "zhanshan", "cnblogs.com"));
SyndicationItem item1 = new SyndicationItem("Title1",
    "Microsoft may have patents, patent applications, trademarks, ...more",
    new Uri("http://www.microsoft.com"))
    {Summary = new TextSyndicationContent("sumary")};
SyndicationItem item2 = new SyndicationItem("Title2",
    "The names of actual companies and products mentioned herein may be ...more",
    new Uri("http://www.microsoft.com"))
    {Summary = new TextSyndicationContent("sumary")};
List<SyndicationItem> syndicationItems = new List<SyndicationItem> {item1, item2};
feed.Items = syndicationItems;

  

  6、Atom的用途
  资源的创建与消费使用Atom是一种比较理想的方式。在Atom中,我们可以将不能以超媒体格式的资源链接到资源的条目中,使用<Content>的src属性链接到这些资源。在REST架构中,我们可以适应Atom来获取资源的表述,并通过它的link超媒体控件来驱动业务的执行进而转移应用的状态。Atom作为IETF推荐的一种标准的超媒体格式,已经广泛应用在成千上万个Web项目中,如Gmail。

参考:http://zh.wikipedia.org/wiki/Atom_(%E6%A8%99%E6%BA%96) 

原文地址:https://www.cnblogs.com/tyb1222/p/2290053.html