要了解自发布以来报告的任何错误或问题,请查阅 勘误表。
此规范的英文版本是唯一的标准版本。此外还可能存在不具标准效力的 翻译版本。
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本规范详细介绍了一种使用 JSON 格式表示潜在与已完成活动的模型。它旨在与词汇集配合使用。由词汇集中的词汇详细描述活动结构并定义特定的活动类型。
本节描述了本文档在发布时的状态。其它文档可能会取代本文档。当前 W3C 发布的文档列表与本技术报告的最新修订版可在 W3C 技术报告索引(https://www.w3.org/TR/)中找到。
本文档由 社交网络工作组作为推荐规范发布。欢迎对本文档提出意见。请发送至 public-socialweb@w3.org(订阅, 归档)。
请参阅工作组的 实现报告。
本文档已经过 W3C 会员、软件开发人员以及其它 W3C 小组与利益相关方的审核,并由指导组批准为 W3C 推荐规范。这是一份处于稳定版本的文档,可用作参考材料或作为其它文档的引用依据。W3C 在制定推荐规范方面的作用是引起对规范的关注并促进其广泛部署,这增强了 Web 的功能与互操作性。
本文档由根据 2004年2月5日 W3C 专利政策运作的小组制作。 W3C 维护了一份与该小组可交付成果相关的 专利披露公开列表;该页面还包括披露专利的说明。任何实际知晓某项专利,并认为此专利中含有其 基本权利要求 的专利的个人必须根据 W3C 专利政策第 6 节披露该信息。
本文档受 2017年3月1日的 W3C 流程文档约束。
从最基本的意义上讲,“活动”是对动作的语义描述。本规范的目标是提供一种基于 JSON 的语法,足以以一种丰富、人类友好、可由机器处理、可扩展的方式表达关于活动的元数据。这可以包括构建关于活动的自然语言描述或视觉表示、将可操作信息与各种类型的对象关联、传达或记录活动日志,或者将潜在操作委派给其它应用。
本文档中的关键字“必须”、“不得”、“强制”、“应当”、“不应”、“应该”、“不该”、“推荐”、“可以”与“可选”应按照 [RFC2119] 中的描述进行解释。
本节为非规范性内容。
Activity Streams 2.0 适合作为社交数据语法。它构成了 [SWP] 相关标准套件的一部分。
本节为非规范性内容。
JSON Activity Streams 1.0 [AS1] 规范发布于 2011 年 5 月,为表达已完成的活动提供了一套基础的可扩展语法。本规范在最初的基础之上,结合了通过广泛实现、社区反馈以及来自各种其它社区的相关持续工作所获得的经验教训。
促使 Activity Streams 从 1.0 演进到 2.0 的一些具体动因包括:
术语 displayName、verb、title 与 objectType 应被视为保留术语,不该在 Activity Streams 2.0 文档中使用。在 Activity Streams 2.0 文档中遇到这些术语时,应该按照 附录 B. 废弃的 Activity Streams 1.0 语法 中列出的指南进行处理。
本规范为 Activity Vocabulary 描述了一种基于 JSON [RFC7159] 的序列化语法,该语法符合 [JSON-LD] 语法约束的子集,但不强制要求 JSON-LD 处理。虽然也可能存在其它序列化形式,但本文档不讨论此类替代方案。
序列化时,缺失的属性通过 (a) 将属性值设置为 null,或 (b) 由发布者选择完全省略属性声明来表示。这两种表示在语义上是等效的。若一个属性具有数组值,则该数组中没有任何项的情况必须通过完全省略该属性或将值设置为 null 来表示。对省略或显式为 null 的值的正确解释是“尚未分配任何值”,而不是将其视为给定值为空或 nil。
Activity Streams 文档是 JSON 文档,其根值为任意类型的 Activity Streams 对象(包括 集合),且其 MIME 媒体类型为 “application/activity+json”。
Activity Streams 2.0 文档必须使用 UTF-8 字符编码进行序列化。
Activity Streams 2.0 文档的序列化 JSON 形式必须与标准 JSON-LD 1.0 处理算法与 API [JSON-LD-API] 压缩算法所产生的结果一致,且至少使用此处提供的规范性 JSON-LD @context 定义。具体实现可以为提供的 @context 补充额外的 @context 定义,但不得覆盖或更改规范性上下文。实现可以使用 JSON-LD @context 中未定义的额外属性与值,但需理解,任何此类属性在使用标准 JSON-LD 算法的消费端实现中可能不受支持并被忽略。有关处理 Activity Streams 2.0 文档中扩展的更多信息,请参阅可扩展性部分。
JSON-LD 使用特殊的 @context 属性来定义处理上下文。@context 属性的值由 [JSON-LD] 规范定义。生成 Activity Streams 2.0 文档的实现应该包含一个 @context 属性,其值包含对规范性 Activity Streams 2.0 JSON-LD @context 定义的引用,使用的 URL 为 “https://www.w3.org/ns/activitystreams”。实现可以改用替代 URL “http://www.w3.org/ns/activitystreams”。这可以通过字符串、对象或数组来完成。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "一条记录",
"type": "Note",
"content": "我的狗身上有跳蚤。"
}
@vocab 关键字与扩展术语前缀,提供对象上下文的文档。
{
"@context": {
"@vocab": "https://www.w3.org/ns/activitystreams",
"ext": "https://canine-extension.example/terms/",
"@language": "zh"
},
"summary": "一条贴文",
"type": "Note",
"content": "我的狗身上有跳蚤。",
"ext:nose": 0,
"ext:smell": "terrible"
}
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"css": "http://www.w3.org/ns/oa#styledBy"
}
],
"summary": "一条贴文",
"type": "Note",
"content": "我的狗身上有跳蚤。",
"css": "http://www.csszengarden.com/217/217.css?v=8may2013"
}
当启用 JSON-LD 的 Activity Streams 2.0 实现遇到 MIME 媒体类型为 “application/activity+json” 的 JSON 文档,且该文档不包含引用了规范性 Activity Streams 2.0 JSON-LD @context 定义的 @context 属性的值时,实现必须假设规范性 @context 定义仍然适用。
本规范使用 IRI [RFC3987]。每个 URI [RFC3986] 也是一个 IRI,因此在需要 IRI 的任何地方都可以使用 URI。有两个特殊的考量:(1) 当对一个非 URI 的 IRI 进行解引用时,必须使用 [RFC3987] 第 3.1 节中的步骤映射到 URI;(2) 当 IRI 用作 “id” 值时,不得进行此类映射。
由于许多 JSON 解析器实现无法可靠地保留正确解析相对引用所需的基础上下文,因此不该在 Activity Streams 2.0 文档中使用相对 IRI(及 URL)引用。
所有带有日期值与时间值的属性必须符合 [RFC3339] 中的 “date-time” 产生式,唯一例外是秒数可以省略。必须使用大写字母 “T” 分隔日期与时间,在没有数字时区偏移的情况下,必须使用大写字母 “Z”。
日期与时间使用以下 [ABNF] 语法描述进行规定。“time-hour”、“time-minute”、“time-second”、“time-secfrac”、“time-offset” 与 “full-date” 构造遵循 [RFC3339] 的定义。
as2-partial-time = time-hour ":" time-minute [":" time-second]
[time-secfrac]
as2-full-time = as2-partial-time time-offset
as2-date-time = full-date "T" as2-full-time
需要注意的是,`time-offset` 分量与时区无关。虽然包含 `time-offset` 分量的时间在时间戳方面表现良好,但在没有额外信息与处理的情况下,它们无法可靠地与本地“挂钟时间”进行相互转换。
本节为非规范性内容。
以下是三个细节程度不同的活动示例。
每个示例都使用本规范定义的规范性 JSON 序列化形式进行展示。
'http://www.test.example/martin' 创建了
'http://example.org/foo.jpg'。未给出额外细节。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin created an image",
"type": "Create",
"actor": "http://www.test.example/martin",
"object": "http://example.org/foo.jpg"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin 向他的博客添加了一篇文章",
"type": "Add",
"published": "2015-02-10T15:04:55Z",
"actor": {
"type": "Person",
"id": "http://www.test.example/martin",
"name": "Martin Smith",
"url": "http://example.org/martin",
"image": {
"type": "Link",
"href": "http://example.org/martin/image.jpg",
"mediaType": "image/jpeg"
}
},
"object" : {
"id": "http://www.test.example/blog/abc123/xyz",
"type": "Article",
"url": "http://example.org/blog/2011/02/entry",
"name": "为什么我喜欢 Activity Streams"
},
"target" : {
"id": "http://example.org/blog/",
"type": "OrderedCollection",
"name": "Martin 的博客"
}
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Martin 的近期活动",
"type": "Collection",
"totalItems": 1,
"items" : [
{
"type": "Add",
"published": "2011-02-10T15:04:55Z",
"generator": "http://example.org/activities-app",
"nameMap": {
"zh": "Martin 向他的相册添加了一张新图片。",
"ga": "Martin phost le fisean nua a albam."
},
"actor": {
"type": "Person",
"id": "http://www.test.example/martin",
"name": "Martin Smith",
"url": "http://example.org/martin",
"image": {
"type": "Link",
"href": "http://example.org/martin/image",
"mediaType": "image/jpeg",
"width": 250,
"height": 250
}
},
"object" : {
"name": "我毛茸茸的猫咪",
"type": "Image",
"id": "http://example.org/album/máiréad.jpg",
"preview": {
"type": "Link",
"href": "http://example.org/album/máiréad.jpg",
"mediaType": "image/jpeg"
},
"url": [
{
"type": "Link",
"href": "http://example.org/album/máiréad.jpg",
"mediaType": "image/jpeg"
},
{
"type": "Link",
"href": "http://example.org/album/máiréad.png",
"mediaType": "image/png"
}
]
},
"target": {
"type": "Collection",
"id": "http://example.org/album/",
"nameMap": {
"zh": "Martin 的相册",
"ga": "Grianghraif Mairtin"
},
"image": {
"type": "Link",
"href": "http://example.org/album/thumbnail.jpg",
"mediaType": "image/jpeg"
}
}
}
]
}
Activity Vocabulary 规范性地定义了 Activity Streams 2.0 的核心对象类型与属性。
该词汇集定义的对象类型被细分为一组核心类型(共八个),以及一组在社交网络应用中通用的扩展活动与对象类型。核心类型包括:
OrderedCollection)、CollectionPage),以及OrderedCollectionPage)。
Activity Streams 2.0 文档中的每个 JSON 对象要么是一个 Object,要么是一个 Link。Activity Vocabulary 中定义的所有其它类型,以及所有扩展类型,都派生自这两个基础类型。
若满足以下任一条件,Activity Streams 2.0 文档中的 JSON 对象就是一个 Link:(a) 对象包含一个 type 属性,其值包含 “Link”;或 (b) type 属性值中包含的任何类型被定义为 Link 的扩展(例如参见 Mention);否则该 JSON 对象将被视为 Object 的实例或扩展。
Object 是 Activity Streams 词汇集的主要基础类型。
除具有全局标识符(使用 id 属性表示为绝对 IRI)与“对象类型”(使用 type 属性表示)之外,Object 类型的所有实例都共享一组由 Activity Vocabulary 规范性定义的通用属性。这些属性包括:
attachment |
attributedTo |
audience |
content |
context |
contentMap |
name |
nameMap |
endTime |
generator |
icon |
image |
inReplyTo |
location |
preview |
published |
replies |
startTime |
summary |
summaryMap |
tag |
updated |
url |
to |
bto |
cc |
bcc |
mediaType |
duration
所有属性都是可选的(包括 id 与 type)。
id 与 type 属性来表达全局标识符与对象类型:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "http://example.org/foo",
"type": "Note",
"name": "我最喜欢的炖菜食谱",
"attributedTo": {
"id": "http://joe.website.example/",
"type": "Person",
"name": "Joe Smith"
},
"published": "2014-08-21T12:34:56Z"
}
Activity Vocabulary 定义了一系列许多社交网络应用通用的 Object 类型。本规范并未针对这些对象中的大多数对象定义特定语义的属性。可以使用外部词汇集来表达 Activity Vocabulary 未涵盖的额外细节。
此外,虽然实现可以自由引入 Activity Vocabulary 定义之外的新对象类型,但当应用过度依赖其它实现无法识别的扩展类型时,可能会出现互操作问题。应注意不要与现有对象类型不当重叠或重复。
当一个实现使用了与核心词汇集类型重叠的扩展类型时,该实现必须同时指定该核心词汇集类型。例如,某些词汇集(如 Good Relations Vocabulary)定义了其自有的用于描述地点的类型。若实现希望将 http://purl.org/goodrelations/v1#Location 用作对象类型,则必须同时将该对象标识为 地点 (Place),如下所示:
Place 与 gr:Location 的对象:{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"gr": "http://purl.org/goodrelations/v1#"
}
],
"type": ["Place", "gr:Location"],
"name": "Sally 的餐馆",
"longitude": 12.34,
"latitude": 56.78,
"gr:category": "restaurants/french_restaurants"
}
某些由外部词汇集定义的属性可能与 Activity Vocabulary 定义的属性重叠或重复。为了保持一致的互操作性,在存在此类重叠的地方,实现必须优先使用 Activity Vocabulary 定义的属性。
Activity Streams 消费者通常需要 Activity Streams 对象的文本表示,例如用于在 Web 浏览器或控制台界面中显示。
name 属性应该从创建者或其它用户的输入中派生。
summary 属性应该用作备选的文本表示,且可能由发布者自动生成。若不含 name 属性,则 summary 属性不该包含标记语言,且应该足够简短,以便用作对象的合理文本表示。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"id": "http://example.org/note/123",
"name": "我们这天气不错",
"content": "我觉得天气很适合我们这的季节和地点。"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"id": "http://example.org/note/124",
"summary": "Sally 的贴文",
"content": "这里一切都好。"
}
name 与 summary 可以缺失,可以缺少最终用户当前语言的显式值,并且其长度可以超过在当前语言语境下用作文本表示的合适长度。在这种情况下,消费端实现应该具有回退对象的文本表示的能力。
Link 描述了对另一个资源的有限定的、间接的引用,这与 [RFC5988] 中建立的链接概念模型密切相关。Link 对象的属性不是被引用资源的属性,而是作为渲染代理的提示,以了解如何使用该资源。例如,height 与 width 可能表示被引用图像所需的渲染大小,而不是被引用图像的实际像素尺寸。
Link 的目标 URI 使用必需的 href 属性表达。此外,所有 Link 实例共享以下由 Activity Vocabulary 规范性定义的通用可选属性:
id |
name |
hreflang |
mediaType |
rel |
height |
width
例如,所有对象都可以包含一个 image (图像) 属性,其值描述了包含对象的图形表示。该属性通常用于提供指向可显示给用户的图像(例如 JPEG、GIF 或 PNG)资源的 URL。任何给定的对象都可能有多个此类视觉表示——例如,多个屏幕截图,或不同分辨率的同一张图像。在 Activity Streams 2.0 中,本质上有三种描述此类引用的方法。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": "http://example.org/application/123.png"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": {
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
}
从形式上讲,前一个示例与图像资源建立了一种无限定的直接关系,而后者创建了一种有限定的、间接的关系,允许指定关于该关系的额外属性。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
]
}
此类数组中包含的各个项是彼此独立的,且顺序不具有特殊意义。
RFC 5988 规定所有 Link 都有一个描述链接语境用途的 “链接关系 (link relation)”。在 Link 中,rel 属性提供链接关系值。如果未指定 rel 属性,则认为链接关系是未指定的。任何给定的 Link 都可以有多个链接关系值。在 JSON 序列化中,单个链接关系表达为单个 JSON 字符串。多个链接关系表达为 JSON 字符串数组。
链接关系的范围是将该 Link 作为直接子项的对象。
以下示例提供了两个单独的引用。第一个的链接关系未指定,而第二个的链接关系为 “thumbnail”。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png",
"rel": "thumbnail"
}
]
}
应当指出,[HTML5] 规范提供了其自己对 “链接关系” 的替代定义,该定义与 [RFC5988] 中的定义略有不同。在 HTML5 定义中,任何不包含空格(U+0020)、水平制表符(U+0009)、换行(U+000A)、换页(U+000C)、回车(U+000D)或逗号(U+002C)字符的字符串都可以用作有效的链接关系。为提高互操作性,Activity Streams 2.0 实现必须仅使用在 [RFC5988] 与 [HTML5] 定义下语法上均有效的链接关系。实现可以使用未注册的链接关系值。
Actor 对象是基础 Object 类型的特化,表示能够执行 Activity 的实体。Activity Vocabulary 规范性地定义了五种特定类型的 Actor:
Application (应用)
|
Group (群组) |
Organization (组织) |
Person (人) |
Service (服务)。
本规范有意仅以最通用的方式定义 Actor,不对每种类型定义特定语义的属性。所有 Actor 对象都是 Object 的特化,并继承所有对象共有的核心属性。可以使用外部词汇集来表达 Activity Vocabulary 未涵盖的额外细节。对于 Person、Group 与 Organization 实例,应该使用 VCard [vcard-rdf] 来提供额外的元数据。
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"vcard": "http://www.w3.org/2006/vcard/ns#"}
],
"summary": "Sally 创建了一条贴文",
"type": "Create",
"actor": {
"type": ["Person", "vcard:Individual"],
"id": "http://sally.example.org",
"name": "Sally Smith",
"vcard:given-name": "Sally",
"vcard:family-name": "Smith"
},
"object": {
"type": "Note",
"content": "这是一条简单的贴文"
}
}
虽然实现可以自由引入 Activity Vocabulary 定义之外的新 Actor 类型,但当应用过度依赖其它实现无法识别的扩展类型时,可能会出现互操作性问题。应注意不要过度重叠或重复现有的 Actor 类型。
当一个实现使用了与核心词汇集类型重叠的扩展类型时,该实现必须同时指定该核心词汇集类型。例如,某些词汇集(如 VCard)定义了其自有的用于描述人的类型。若实现希望将 vcard:Individual 用作 Actor,必须同时将该 Actor 标识为 Person,如前一示例所示。
Activity 对象是基础 Object 类型的特化,提供有关已发生、正在发生或将来可能发生的动作的信息。
除所有 Object 实例支持的通用属性外,Activity 对象还支持由 Vocabulary 定义的以下额外属性:
actor |
object |
target |
origin |
result |
instrument
type 属性用于标识活动语句所代表的动作类型。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Joe 点赞了一条贴文",
"type": "Like",
"id": "http://www.test.example/activity/1",
"actor": "http://example.org/profiles/joe",
"object": "http://example.com/notes/1",
"published": "2014-09-30T12:34:56Z"
}
Activity Vocabulary 定义了少量许多社交网络应用通用的 Activity 类型。本规范未针对这些活动中的大多数定义特定语义的属性。可以使用外部词汇集来表达 Activity Vocabulary 未涵盖的额外细节。
虽然实现可以自由引入 Activity Vocabulary 定义之外的新活动类型,但当应用过度依赖其它实现无法识别的扩展类型时,可能会出现互操作性问题。应注意不要过度重叠或重复现有的活动类型。
当一个实现使用了与核心词汇集类型重叠的扩展类型时,该实现必须同时指定该核心词汇集类型。例如,某些词汇集(如 Schema.org)定义了其自有的用于描述动作的类型。若实现希望将 http://schema.org/LikeAction 用作 Activity,必须同时将该对象标识为 Like,如下所示:
Like 与 http://schema.org/LikeAction 的 Activity:{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Joe 点赞了一条贴文",
"type": ["Like", "http://schema.org/LikeAction"],
"id": "http://www.test.example/activity/1",
"actor": "http://example.org/profiles/joe",
"object": "http://example.com/notes/1",
"published": "2014-09-30T12:34:56Z"
}
实现可以自由地在被动操作与主动操作中使用 Activity 对象。在被动意义上,Activity 用于记录一个活动已经发生或正在发生。在主动意义上,Activity 可以用作一种命令形式,指示应用以某种与所描述动作一致的方式修改状态。然而,由于本规范并未定义约束应用如何使用该格式的规范性处理模型,因此关于活动语句是被解释为被动通知还是命令式命令的区别可能因实现而异。
IntransitiveActivity 对象是 Activity 类型的特化,表示不及物动作。IntransitiveActivity 对象没有 object 属性。
Collection 对象是基础 Object 的特化,用作其它 Object 或 Link 的容器。
除由所有 对象 继承的基础属性外,所有 Collection 类型都包含额外属性:
items |
totalItems |
first |
last |
current
Collection 中的项可以是有序的,也可以是无序的。OrderedCollection 类型可以用于标识其项始终有序的集合。在 JSON 序列化中,集合的无序项使用 items 属性表示,而有序项使用 orderedItems 属性表示。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "对象历史",
"type": "Collection",
"totalItems": 2,
"items": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
},
{
"type": "Like",
"actor": "http://www.test.example/joe",
"object": "http://example.org/foo"
}
]
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "对象历史",
"type": "OrderedCollection",
"totalItems": 2,
"orderedItems": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
},
{
"type": "Like",
"actor": "http://www.test.example/joe",
"object": "http://example.org/foo"
}
]
}
一个集合可能包含大量项。通常,让一个实现仅使用 items (或 orderedItems) 属性来序列化集合包含的每一个项不切实际。在这种情况下,集合内的项可以被划分为不同的子集或“页”。页使用 CollectionPage 类型标识。
类型扩展自基础 CollectionPage
Collection 类型并继承其所有属性。还可以指定以下额外属性:
partOf |
next |
prev |
partOf 属性标识 CollectionPage 所包含的项所属的 Collection。
first, next, prev, last, 与 current 属性用于引用包含来自上层集合的其它项的子集的其它 实例。
CollectionPage
与 Collection 对象一样,CollectionPage 内部的项可能是有序的或无序的。OrderedCollectionPage 类型可以用于标识项严格有序的页。
类型同时扩展自 OrderedCollectionPage
与 CollectionPage
。除从这两者继承的属性外,OrderedCollectionOrderedCollectionPage 还可能包含一个额外的 startIndex 属性,其值表示页包含的首个项在该页所属的 OrderedCollection 中的相对索引位置。
Collection, OrderedCollection, CollectionPage, 与 OrderedCollectionPage 之间关系的说明:
无论是否有序,Collection 的页通常按序列排列(单向或双向链表)。first 属性用于标识该序列中的第一页,而 last 属性用于标识序列中的最后一页。prev 与 next 属性分别标识紧邻其前与紧邻其后的页。
current 属性标识一个页,该页包含 Collection 中最近创建或更新的项子集。
first, last, next, prev, 与 current 属性的值可以是一个 ,或者是引用包含 CollectionPage 的单独资源的 CollectionPageLink。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Sally 的最近活动",
"type": "Collection",
"id": "http://example.org/foo",
"totalItems": 10,
"first": {
"type": "CollectionPage",
"id": "http://example.org/foo?page=1",
"partOf": "http://example.org/foo",
"next": "http://example.org/foo?page=2",
"items": [
{
"type": "Create",
"actor": "http://www.test.example/sally",
"object": "http://example.org/foo"
}
]
}
}
在 OrderedCollection 中使用分页可能较为繁琐,因为无法保证实现会以任何可预测的顺序处理页序列。若实现希望在逻辑集合中重构成员项的适当完整顺序,应该转到序列的第一页(或最后一页),然后递归跟随 next (或 prev) 链接,直至处理完所有页。OrderedCollection 的页应该是 OrderedCollectionPage 的实例。若 OrderedCollection 的页不是 OrderedCollectionPage 实例,则消费者将无法可靠地重新构建集合中项的适当顺序。
由 Vocabulary 定义的多个属性被定义为具有自然语言值。这些是使用一种或多种语言的、人类可读的字符串。在 JSON 序列化中,它们表达为:(1) 单个 JSON 字符串,或 (2) 一个 JSON 对象,将符合规范的 [BCP47] 语言标签映射到该字符串值的本地化等效翻译。在序列化 JSON 中,这两种形式通过简单的属性命名约定来区分,例如:“name” 标识 name 属性的 JSON 字符串形式,而 “nameMap” 表示对象形式。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"name": "这就是标题"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"nameMap": {
"zh": "这是标题",
"fr": "C'est le titre",
"es": "Este es el título"
}
}
对象形式中的每个键必须是一个符合规范的 [BCP47] 语言标签。关联的值必须是字符串。
Activity Vocabulary 定义了三个使用自然语言值的属性:name, summary, 与 content。相应地,在 JSON 序列化中,术语 “name”, “summary”, 与 “content” 代表 JSON 字符串形式;而术语 “nameMap”, “summaryMap”, 与 “contentMap” 代表对象形式。
特殊的语言标签 "und" 可在对象形式中用于显式标识语言未知或未确定的值。
"und" 语言标签:{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"nameMap": {
"und": "This is the title"
}
}
当使用 [JSON-LD] 机制产生或消费 Activity Streams 2.0 文档时,@language 属性可以在 @context 中使用以标识默认语言。选择不使用 JSON-LD 处理 Activity Streams 2.0 文档的实现可能无法理解此机制。
@context 中指定默认 "@language":
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"@language": "zh"
}],
"type": "Object",
"name": "这就是标题"
}
Activity Streams 2.0 文档中的自然语言值可以包含双向文本。Activity Streams 2.0 文档的默认基础方向是从左至右。如下所述,单个自然语言值的基础方向可以修改。
当为自然语言值指定双向文本,且文本的基础方向无法通过该文本的第一个强方向性字符正确识别时,发布者应该显式标识默认方向,方法是在值前添加适当的 Unicode 双向控制字符,或在允许的情况下使用 HTML 方向标记。
消费包含双向文本的 Activity Streams 2.0 文档的消费者应该通过扫描文本中不在标记标签内的第一个强方向性字符,或利用提供的方向性标记来识别任何给定自然语言值的基础方向。一旦识别出基础方向,消费者必须根据 Unicode 双向算法 [BIDI] 确定自然语言值的适当渲染与显示方式。为了应用基础方向,这可能需要在显示之前在字符串周围包裹额外的控制字符或标记。
| 属性 | 值 | 方向 | 方法 |
|---|---|---|---|
name |
"פעילות הבינאום, W3C" |
从右至左 | 首个强方向性字符 |
name |
"The document was titled, '\u2067פעילות הבינאום, W3C\u2069'"
|
从左至右 | 首个强方向性字符 |
name |
"\u200FHTML היא שפת סימון" |
从右至左 | 双向控制字符 |
name |
"\u200E'سلام' is hello in Persian." |
从左至右 | 双向控制字符 |
summary |
<p dir=\"rtl\">HTML היא שפת סימון>/p>
|
从右至左 | HTML 标记 |
summary |
<p>פעילות הבינאום, W3C</p> |
从右至左 | 首个强方向性字符(忽略标记) |
summary |
<p title="سلام">Hello</p>
|
从左至右 | 首个强方向性字符(忽略标记) |
Activity Streams 2.0 发布者应该使用映射属性或默认语言标签显式标记自然语言属性的语言(若语言已知)。
本规范中的并非所有示例都显式标记了自然语言属性的语言。这是有意为之。编者与工作组希望避免实现者直接从文档中复制粘贴带有显式语言标记的示例作为新文档的模板,从而导致不准确的语言标记。
在 Activity Streams 2.0 中,“扩展 (extension)”是指任何未由 Activity Vocabulary 定义的属性、活动、行为体或对象类型。消费端实现在遇到不熟悉的扩展时,不得停止处理或报错,且必须继续处理,将这些属性视同不存在。请注意,不同实现对扩展的支持可能有所不同,且本规范未定义扩展的规范性处理模型。因此,过度依赖扩展的实现可能会导致与其它实现之间的互操作性降低。
对于扩展,[JSON-LD] 被用作定义与消除扩展歧义的主要机制。希望全面支持扩展的实现应该使用 [JSON-LD] 机制。
一些流行的扩展包含在 Activity Streams 2.0 命名空间文档中,可以在 https://www.w3.org/ns/activitystreams#extensions 查阅。社交网络孵化社区组 维护着一个关于 Activity Streams 扩展的百科页面。
需要注意的是,目前定义的 JSON-LD 处理算法 [JSON-LD-API] 将静默忽略 JSON-LD @context 中未定义的任何属性。发布包含扩展属性的 Activity Streams 2.0 文档的实现应该为所有扩展提供 @context 定义。
同样重要的是,有些有效的 JSON 构造无法在 JSON-LD 文档中使用。例如,JSON-LD 禁止使用“数组的数组”,而这在流行的 GeoJSON 规范中有所应用。虽然实现在 Activity Streams 2.0 文档中可以自由地将此类构造作为扩展使用,但使用标准 JSON-LD 处理算法的消费者在应用算法之前,需要忽略此类扩展或将其映射到替代的兼容构造。例如,简单的 GeoJSON Points 可以映射到 Place 对象,而更复杂的几何形状可以转换为 GeoSparql “知名文本” 表示,如下面的非规范性示例所示:
{
"type": "Point",
"coordinates": [36.74, -119.77]
}
Place 替代方案:{
"@context": "https://www.w3.org/ns/activitystreams",
"name": "Fresno, California",
"type": "Place",
"latitude": 36.74,
"longitude": -119.77
}
{
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
}
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"gsp": "http://www.opengis.net/ont/geosparql"}
],
"summary": "A polygon",
"type": "gsp:Geometry",
"gsp:asWKT": "Polygon((100.0, 0.0, 101.0, 0.0, 101.0, 1.0, 100.0, 1.0, 100.0, 0.0))"
}
JSON-LD 语法支持使用 “紧凑 URI”。“紧凑 URI” 是 URI 的另一种编码方式,它使用定义的前缀来简化序列化过程。例如,URI http://example.org/term 可以表示为 ex:term,方法是为 ex: 前缀分配值 http://example.org/。
在 JSON-LD 中,紧凑 URI 前缀在 JSON-LD @context 定义中指定。例如:
{
"@context": {
"ex": "http://example.org/",
"term": {
"@type": "id",
"@id": "ex:term"
}
},
"term": "ex:Foo"
}
在此例中,属性名 term 与值 ex:Foo 都是紧凑 URI。属性名 term 展开为 http://example.org/term,而值 ex:Foo 展开为 http://example.org/Foo。
在 JSON-LD 中,值的紧凑 URI 展开适用于在 @context 定义中被显式定义为 "type": "id" 的属性。具体而言,紧凑 URI 可以用于任何期望 IRI (或 URI) 值的地方。
希望全面支持扩展的 Activity Streams 2.0 实现必须支持由 JSON-LD 规范定义的紧凑 URI 展开。此类展开适用于所有属性名称,以及 JSON-LD @context 中显式定义为类型 @id 的所有属性值。
过度依赖紧凑 URI 形式可能会导致不同实现之间的歧义与互操作性问题。因此,除属性名称与 type 属性的值外,在所有其它情况下都应该避免使用紧凑 URI。
使用 JSON-LD 机制解析并重序列化包含扩展属性的 Activity Streams 2.0 文档的实现,应该采取充分措施确保原始文档中使用的扩展属性得到保留并被适当序列化。
例如,考虑以下包含假设的 foo 与 bar 扩展属性的简单 Activity Stream 对象。foo 扩展定义在 JSON-LD @context 中,而 bar 扩展属性则没有。
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{"foo": "http://example.org/foo"}
],
"type": "Note",
"content": "这是一条简单的贴文",
"foo": 123,
"bar": 321
}
接收此贴文对象的实现可以选择将其作为普通 JSON 对象进行解析,也可以使用标准的 JSON-LD 展开算法。
若实现选择将其作为普通 JSON 解析,然后重序列化该对象(例如为了存储或再分发),那么它只需原样保留 @context, foo 与 bar 属性,并将它们包含在重序列化的输出中。
然而,若实现选择使用 JSON-LD 展开算法,@context 将从展开结果中移除,且 bar 属性将被映射到“空白节点” _:bar。若该文档随后使用规范性 Activity Streams 2.0 上下文重序列化,其 JSON-LD 压缩形式将为:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"content": "这是一条简单的贴文",
"http://example.org/foo": 123,
"bar": 321
}
虽然这很接近原始版本,但为 foo 属性使用完整展开的 URI 标签并不理想。为了确保重序列化的对象能被正确序列化,对接收到的文档执行 JSON-LD 展开的实现应该保留执行 JSON-LD 展开时使用的原始 @context,然后在将对象重序列化为 JSON-LD 压缩形式时重用原始 @context。
Activity Streams 2.0 文档可以(且很可能)包含潜在敏感的个人信息,例如身份、联系信息、地理位置、身体特征等。此外,通常可以对活动数据进行分析,以生成个人或行为体群体的行为概况。
生成或消费 Activity Streams 2.0 文档的实现必须采取措施,向所有潜在用户公开记录并传达:(a) 实现所发布、消费或收集的潜在敏感个人信息的种类;(b) 发布、消费与收集这些信息的原因;(c) 这些信息的使用方式;(d) 这些信息被共享到的任何其它方的身份;以及 (e) 与其它方共享信息的原因。
发布 Activity Streams 2.0 文档的实现应该保持以下默认立场,即除非用户“选择加入”共享额外细节,否则限制文档中包含的敏感个人信息的种类与数量。
消费 Activity Streams 2.0 文档的实现不该在默认情况下存储或共享所消费文档中包含的敏感个人信息,除非用户“选择加入”允许存储或共享这些信息。
在这种情况下,“选择加入”不一定需要用户采取显式行动。例如,若在实现的使用中清楚地隐含了对某些敏感个人信息的使用(例如位置跟踪服务),那么只要遵循上述文档指南,该实现的使用就可以被视为隐式确认敏感个人信息将被使用与共享。
将 Activity Streams 作为公共数据流实现的发布者或消费者可能还希望考虑出现未经请求的商业或恶意内容的可能性,并应采取预防措施来识别此类内容,并对其进行标识或不将其包含在实现中。
发布者应采取合理措施,确保其发布的 Activity Streams 数据中不包含潜在的恶意用户输入,例如跨站脚本攻击。
将摄取的内容重新发送给终端用户的消费者必须采取合理措施确保不重新发送潜在恶意的摄取输入。
为了搜索引擎爬取而重新发出摄取内容的消费者,应采取合理措施限制其网站被用作搜索引擎优化 (SEO) 漏洞。这可能包括将不可信的超链接转换为文本,或包含 rel="nofollow" 属性。
消费者应意识到可能有潜在的欺骗攻击,攻击者可能会发布带有伪造属性值的活动或对象,意图注入恶意内容、隐藏或破坏合法内容,或误导用户。
Activity Streams 是 JSON 文档,受 [RFC7159] 中描述的相同安全考量的约束。
Activity Streams 实现包括处理 URI。请参阅 [RFC3986] 第 7 节。
Activity Streams 实现包括处理 IRI。请参阅 [RFC3987] 第 8 节。
application/activity+json 媒体类型
本规范注册了 application/activity+json MIME 媒体类型,专门用于标识符合 Activity Streams 2.0 格式的文档。
| 类型名称: | application |
| 子类型名称: | activity+json |
| 必需参数: | 无 |
| 可选参数: |
profile: application/activity+json 媒体类型的 profile 参数允许指定一个或多个 profile URI。这些 profile URI 具有 [RFC6906] 中定义的标识符语义。“profile” 媒体类型参数必须加引号。它包含一个以空格分隔的 URI(即 profile URI)的非空列表。
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI = URI 上述语法中的 “URI” 指的是 [RFC3986] 第 3 节中定义的 “URI”。
|
| 编码考量: |
使用 “application/activity+json” 媒体类型的资源必须符合 “application/json” 媒体类型的所有要求,因此受 [RFC7159] 第 11 节中规定的相同编码考量的约束。
|
| 安全考量: | 如本规范所定义。 |
| 联系人: | James M Snell <jasnell@gmail.com> |
请注意,虽然 Activity Streams 2.0 格式使用了 JSON-LD 约定,但对于 Activity Streams 2.0 实现有许多约束与额外要求,这证明了使用特定媒体类型的合理性。
由于 Activity Streams 2.0 可以被视为 JSON-LD 的受限规范配置,因此实现应该将 `application/ld+json; profile="https://www.w3.org/ns/activitystreams"` 媒体类型视为等同于 `application/activity+json`。
本规范中的所有图表、示例与注释均为非规范性内容,所有明确标记为非规范性的章节也是如此。本规范中的其它内容均为规范性内容。
符合规范的文档是指符合文档所有一致性标准的文档。为了便于阅读,其中一些一致性要求被表述为对发布者的一致性要求;此类要求隐含地是对文档的要求:根据定义,所有文档都假定拥有一个发布者。
符合规范的文档不得包含来自 Activity Streams 1.0 的废弃或过时语法。符合规范的文档必须包含来自 Activity Vocabulary 的属性与类型。使用其它词汇集的符合规范文档还必须包含等效的 Activity Vocabulary 属性与类型,如附录 C 所示。符合规范的文档不得使用本规范禁止的 JSON-LD 功能或其它序列化功能,详见第 2 节。包含 Activity Streams 2.0 Vocabulary 定义之外的类型或属性的符合规范文档必须使用第 5 节中定义的扩展功能。
非详尽的文档示例列表包括:
符合规范的实现是指发布、存储、分析、消费或以其它方式处理符合规范文档的软件。两种主要的实现是发布者与消费者。
符合规范的发布者是创建并发布符合规范文档的实现。符合规范的发布者必须根据第 2 节的序列化要求提供符合规范的文档。符合规范的发布者必须考虑第 6 节所述的隐私问题。符合规范的发布者必须考虑第 7 节所述的安全问题。
非详尽的发布者示例列表包括:
符合规范的消费者是读取并分析符合规范文档的实现。符合规范的消费者必须容忍来自 Activity Streams 1.0 的废弃或过时属性或类型。符合规范的消费者必须忽略不适用于其应用领域的属性或类型。
符合规范的消费者可以以其它数据格式重新发布符合规范的文档。符合规范的消费者可以在屏幕上、以纸质形式、以音频格式或使用其它演示机制向用户呈现符合规范的文档。符合规范的消费者必须忠实地将符合规范文档中表示的信息翻译成这些其它格式或媒体。重新发布符合规范文档的符合规范消费者必须考虑第 6 节所述的隐私问题与第 7 节所述的安全问题。
非详尽的消费者示例列表包括:
Activity Streams 2.0 规范是 W3C 社交网络工作组的产品。编者感谢所有为对话、议题与测试做出贡献的工作组成员,这些工作帮助塑造了当前的规范。
编者还希望感谢在该规范被纳入 W3C 社交网络工作组之前为 Activity Streams 做出贡献的所有人。Activity Streams 1.0 是一个社区驱动的努力,若没有社区早期的贡献,该规范就不会有今天的成就。贡献者包括但不限于:Abdul Qabiz, Adina Levin, Adrian Chan, Adriana Javier, Alan Hoffman, Alex Kessinger, Alexander Ovchinnikov, Alexander Zhuravlev, Alexandre Loureiro Solleiro, Amy Walgenbach, Andres Vidal, Angel Robert Marquez, Ari Steinberg, Arjan Scherpenisse, Arne Roomann-Kurrik, Beau Lebens, Ben Hedrington, Ben Metcalfe, Ben Werdmuller, Benjamin Goering, Bill de hOra, Bo Xing, Bob Aman, Bob Wyman, Brett Slatkin, Brian Walsh, Brynn Evans, Charlie Cauthen, Chris Chabot, Chris Messina, Chris Toomey, Christian Crumlish, Dan Brickley, Dan Scott, Daniel Chapman, Danny Ayers, Dare Obasanjo, Darren Bounds, David Cramer, David Nelson, David Recordon, DeWitt Clinton, Douglas Pearce, Ed Summers, Elias Bizannes, Elisabeth Norris, Eric Marcoullier, Eric Woods, Evan Prodromou, Gee-Hsien Chuang, Greg Biggers, Gregory Foster, Henry Saputra, Hillary Madsen, Howard Liptzin, Hung Tran, Ian Kennedy, Ian Mulvany, Ivan Pulleyn, Jacob Kim, James Falkner, James Pike, James Walker, Jason Kahn, Jason Kantz, Jeff Kunins, Jeff Martin, Jian Lin, Johannes Ernst, John Panzer, Jon Lebkowsky, Jon Paul Davies, Jonathan Coffman, Jonathan Dugan, Joseph Boyle, Joseph Holsten, Joseph Smarr, Josh Brewer, Jud Valeski, Julien Chaumond, Julien Genestoux, Jyri Engestroem, Kaliya Hamlin, Kevin Marks, Laurent Eschenauer, Laurie Voss, Leah Culver, Libby Miller, Manu Mukerji, Mark Weitzel, Marko Degenkolb, Marshall Kirkpatrick, Martin Atkins, Martin Svensson, Marty Alchin, Mary Hoder, Matt Leventi, Matt Wilkinson, Matthias Mueller-Prove, Max Engel, Max Wegmueller, Melvin Carvalho, Michael Buckbee, Michael Chan, Michael Richardson, Michael Sullivan, Mike Macgirvin, Mislav Marohnić, Mo Jangda, Monica Wilkinson, Nate Benes, NeilFred Picciotto, Nick Howard, Nick Lothian, Nissan Dookeran, Nitya Narasimhan, Pablo Martin, Padraic Brady, Pat Cappelaere, Patrick Aljord, Peter Ferne, Peter Reiser, Peter Saint-Andre, Phil Wolff, Philip (flip) Kromer, Richard Cunningham, Richard Zhao, Rick Severson, Robert Hall, Robert Langbert, Robert Dolin, Robin Cover, Ryan Boyd, Sam Sethi, Scott Raymond, Scott Seely, Simon Grant, Simon Wistow, Stephen Garcia, Stephen Sisk, Stephen Paul Weber, Steve Ivy, Steve Midgley, Steven Livingstone-Perez, Sylvain Carle, Sylvain Hellegouarch, Tantek Çelik, Tatu Saloranta, Tim Moore, Timothy Young, Todd Barnard, Tosh Meston, Tyler Gillies, Will Norris, Zach Copley, Laurent-Walter Goix, Matthew Marum, Andy Smith, 与 Zach Shepherd。
本节为非规范性内容。
注:虽然此附录章节是非规范性的,但它使用了诸如 必须 等规范性术语。这些术语在此处的使用是为了指示,若实现者选择这样做,正确实现本附录中描述的 Activity Streams 1.0 向后兼容模型所需的条件。
虽然本规范定义的语法与 JSON Activity Streams 1.0 定义的语法有所不同,但原始规范定义的基本模型保持不变。本规范定义了具体的处理规则,允许将现有的 Activity Streams 1.0 文档映射到并作为 Activity Streams 2.0 文档进行处理。
本规范定义的 JSON 语法在某些方面与原始 JSON Activity Streams 1.0 [AS1] 规范不同,且不向后兼容。实现可以选择继续支持 JSON Activity Streams 1.0 语法,但应将其视为已废弃。这意味着虽然实现可以继续消费 1.0 语法,但不应输出 1.0 语法,除非专门与较旧的非 2.0 兼容实现进行交互。
具体而言:
application/stream+json” MIME 媒体类型;而在生成符合 2.0 语法的序列化文档时,使用 “application/activity+json”。
application/stream+json” 或更通用的 “application/json” MIME 媒体类型标识的序列化文档,必须遵循 [AS1] 设定的语法与处理规则。2.0 语法与处理规则仅在处理使用 “application/activity+json” 媒体类型的序列化时适用。
id 视为 JSON-LD @id 关键字的别名;并将 objectType 与 verb 属性视为 JSON-LD @type 关键字的别名。
displayName 属性,该属性在 Activity Streams 2.0 中已重命名为 name。实现应将 displayName 视为 name 的别名。
title 属性,该属性已在 Activity Streams 2.0 中删除。将 Activity Streams 1.0 文档作为 Activity Streams 2.0 处理的实现,应将 title 属性的实例视为扩展。
content 与 summary 属性重新定义为自然语言值,这意味着它们的值可以表示为字符串,也可以表示为将语言标签映射到字符串值的对象。在 1.0 语法中,这些属性仅表示为字符串值。由于 1.0 的值是本规范允许的有效子集,因此实现不需要采取任何特定行动来继续支持这些值。
upstreamDuplicates 与 downstreamDuplicates 属性,且未提供替代方案。这主要是由于缺乏任何合理的实现证据。虽然 upstreamDuplicates 与 downstreamDuplicates 属性可以继续使用,但实现应该避免使用它们。
post” 动作被定义为描述创建对象并将其实施“发布”或上传到服务的动作。本规范使用单独的 Create 与 Add 活动类型替换了 “post” 动词。在处理 Activity Streams 1.0 文档并将其转换为 2.0 时,实现应该:在未指定 target 属性的情况下,将 “post” 动词的实例视同 Create;在指定了 target 属性的情况下,将其视同 Add。
通过遵循这些指南,2.0 实现将可以成功处理所有 JSON Activity Streams 1.0 序列化。
本节为非规范性内容。
可以使用多个词汇集来覆盖活动的特定特征(如数据来源与注释),从而对 Activity Vocabulary 进行补充。例如:Eric 写了一则短贴文要分享给他的粉丝。发布贴文后,他发现了一个拼写错误。他编辑了贴文并重新发布。随后,Eric 认为贴文中的信息不正确,于是删除贴文。
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"oa": "http://www.w3.org/ns/oa#",
"prov": "http://www.w3.org/ns/prov#",
"dcterms": "http://purl.org/dc/terms/",
"dcterms:created": {
"@id": "dcterms:created",
"@type": "xsd:dateTime"
}
}
],
"summary": "一条贴文的编辑历史",
"type": "Collection",
"items": [
{
"id": "http://example.org/activity/20150101000000",
"type": [ "Create", "prov:Activity" ],
"actor": {
"id": "http://example.org/#eric",
"name": "Eric"
},
"summary": "Eric 编写了一条贴文。",
"object": {
"id": "http://example.org/entry/20150101000000",
"type": [ "Note", "prov:Entity" ],
"attributedTo": "http://example.org/#eric",
"content": "记住……我提供的只有真香。仅此而已。"
},
"published": "2015-01-01T00:00:00Z"
},
{
"id": "http://example.org/activity/20150101000059",
"type": [ "Update", "prov:Activity", "oa:Annotation" ],
"summary": "Eric 编辑了一条贴文。",
"dcterms:created": "2015-01-01T00:00:59Z",
"dcterms:creator": { "@id": "http://example.org/#eric" },
"oa:hasBody": {
"id": "http://example.org/entry/20150101000059",
"type": [ "Note", "prov:Entity" ],
"content": "记住……我提供的只有真相。仅此而已。",
"prov:wasAttributedTo": { "@id": "http://example.org/#eric" },
"prov:wasRevisionOf": { "@id": "http://example.org/entry/20150101000000" }
},
"oa:hasTarget": { "@id": "http://example.org/entry/20150101000000" },
"oa:motivatedBy": { "@id": "oa:editing" },
"prov:generated": { "@id": "http://example.org/entry/20150101000059" },
"prov:wasInformedBy": { "@id": "http://example.org/activity/20150101000000" }
},
{
"id": "http://example.org/activity/20150101010101",
"type": [ "Delete", "prov:Activity" ],
"actor": "http://example.org/#eric",
"summary": "Eric 删除了一条贴文。",
"object": "http://example.org/entry/20150101000059",
"published": "2015-01-01T01:01:01Z"
}
]
}
本节为非规范性内容。
自 2016-12-15 的上一个候选推荐规范以来,本文档进行了以下显著变更:
CollectionPage 属性。
@vocab 关键字与扩展术语前缀提供对象上下文的文档。
'http://www.test.example/martin' 创建了
'http://example.org/foo.jpg'。未给出额外细节。
id 与 type 属性来表达全局标识符与对象类型的示例对象。
Place 与 gr:Location 的对象。"und" 语言标签。Place 对象。