前面一节中讲述了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)

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

  1. OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作

    OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...

  2. 欧盟正研究用三种标准技术应对DNS漏洞

    欧洲网网络与信息安全局(ENISA)正在研究用三种不同方法增强网络地址系统的安全,应对最近发现的互联网域名系统中的安全漏洞. 互联网域名系统中的安全漏洞是研究人员Dan Kaminsky首先发现了.这 ...

  3. QT学习笔记(五):Qt5的8种标准对话框示例

    QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...

  4. PoE交换机三种标准

    在选购PoE设备时,为什么要关注PoE标准呢?不同标准对应不同的功率.电压.电流等,如果PoE设备不符合相应标准,功率达不到要求,就无法正常给PD设备供电.而谈到PoE技术标准,就不得不先了解PoE系 ...

  5. PoE供电的三种标准你知道吗?

    今天给大家讲讲PoE系统和802.3af(PoE).802.3at(PoE+).802.3bt(PoE++)三种标准. PoE 全称为 Power Over Ethernet,PoE 又被称为基于局域 ...

  6. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  7. JNI开发笔记(六)--一种更规范的so库生成方法

    一种更规范的JNI工程写法 引 前言 1. MainActivity中的两个重要的语句 2. 建立Util类来替代MainActivity 3. 在MainActivity中验证JNI工程并生成so库 ...

  8. 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX

    文章目录 一.基于Ubuntu搭建Docker和portainer 1.Docker简介 2.Ubuntu20.04安装Docker-ce 3.Ubuntu20.04安装Docker图形化界面port ...

  9. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  10. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

最新文章

  1. ip地址开头结尾不能为0
  2. MaxCompute JDBC 2.2 发布说明
  3. 网络协议,我明明学过的呀?
  4. 初级中级高级_初级职位,(半)高级职位
  5. lua学习之类型与值篇
  6. Android中的跨进程调用技术AIDL
  7. 简单的mock-server 解决方案
  8. 大数据使用的5种主要数据挖掘技术
  9. undo歌词中文音译_求sanna Nielsen 唱的undo 中文谐音歌词
  10. wifi网卡工作模式和iwconfig
  11. magic API构建和基础实现
  12. 百度2017春招笔试真题编程题集合 [编程题]买帽子
  13. linux 主机名称修改
  14. cesium加载OSM在线地图
  15. 基于STM32F103ZET6主控平台实现电容触摸按键 [基于TIM5_CH2(PA1)的输入捕获]
  16. html设置http缓存代码
  17. 【历史上的今天】4 月 11 日:Apple I 设计完成;微软官宣“告别” Clippy;伯克利计算机先驱出生
  18. 通给给定旋转轴向量v,旋转角度ang,计算出旋转矩阵
  19. 【转需】【金融干货】四步教你:开发风控模型?
  20. DBIDBD::mysql安装

热门文章

  1. UltraCompare如何使用比较 zip、rar、jar格式文件功能
  2. 苹果发布高端头戴式耳机AirPods Max12月15日发售
  3. 为什么Docker不能解决云上的所有问题
  4. 【Linux安全】chattr命令锁定账户敏感文件
  5. Cookie与系统安全
  6. 汇编心得(一)在32位机上实现64位数的相加
  7. ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
  8. 读“我为什么不要应届毕业生”
  9. 苹果macmac效率工具:Alfred
  10. 在苹果Mac上如何查找和删除文件?