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)
REST笔记(三):一种标准的超媒体格式:Atom相关推荐
- OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作
OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...
- 欧盟正研究用三种标准技术应对DNS漏洞
欧洲网网络与信息安全局(ENISA)正在研究用三种不同方法增强网络地址系统的安全,应对最近发现的互联网域名系统中的安全漏洞. 互联网域名系统中的安全漏洞是研究人员Dan Kaminsky首先发现了.这 ...
- QT学习笔记(五):Qt5的8种标准对话框示例
QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...
- PoE交换机三种标准
在选购PoE设备时,为什么要关注PoE标准呢?不同标准对应不同的功率.电压.电流等,如果PoE设备不符合相应标准,功率达不到要求,就无法正常给PD设备供电.而谈到PoE技术标准,就不得不先了解PoE系 ...
- PoE供电的三种标准你知道吗?
今天给大家讲讲PoE系统和802.3af(PoE).802.3at(PoE+).802.3bt(PoE++)三种标准. PoE 全称为 Power Over Ethernet,PoE 又被称为基于局域 ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
- JNI开发笔记(六)--一种更规范的so库生成方法
一种更规范的JNI工程写法 引 前言 1. MainActivity中的两个重要的语句 2. 建立Util类来替代MainActivity 3. 在MainActivity中验证JNI工程并生成so库 ...
- 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX
文章目录 一.基于Ubuntu搭建Docker和portainer 1.Docker简介 2.Ubuntu20.04安装Docker-ce 3.Ubuntu20.04安装Docker图形化界面port ...
- Spring框架学习笔记(三)(AOP,事务管理)
Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...
- SurfaceFlinger学习笔记(三)之SurfaceFlinger进程
概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...
最新文章
- ip地址开头结尾不能为0
- MaxCompute JDBC 2.2 发布说明
- 网络协议,我明明学过的呀?
- 初级中级高级_初级职位,(半)高级职位
- lua学习之类型与值篇
- Android中的跨进程调用技术AIDL
- 简单的mock-server 解决方案
- 大数据使用的5种主要数据挖掘技术
- undo歌词中文音译_求sanna Nielsen 唱的undo 中文谐音歌词
- wifi网卡工作模式和iwconfig
- magic API构建和基础实现
- 百度2017春招笔试真题编程题集合 [编程题]买帽子
- linux 主机名称修改
- cesium加载OSM在线地图
- 基于STM32F103ZET6主控平台实现电容触摸按键 [基于TIM5_CH2(PA1)的输入捕获]
- html设置http缓存代码
- 【历史上的今天】4 月 11 日:Apple I 设计完成;微软官宣“告别” Clippy;伯克利计算机先驱出生
- 通给给定旋转轴向量v,旋转角度ang,计算出旋转矩阵
- 【转需】【金融干货】四步教你:开发风控模型?
- DBIDBD::mysql安装