如需了解发布后报告的任何错误或问题,请查看勘误表。
本规范的英文版本为唯一具有规范性的版本。也可参考非规范性翻译。
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
Micropub 协议用于通过第三方客户端在自己的域名上创建、更新和删除文章。网页应用和原生应用(如 iPhone、Android)都可以使用 Micropub 在你自己的网站上发布和编辑文章、短消息、评论、点赞、照片、事件或其他类型的内容。
本节描述了本文件在发布时的状态。其它文件可能会取代本文件。当前 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 流程文件 管理。
本节为非规范性内容。
Micropub 是一个用于通过网页或原生应用客户端在服务器上创建、更新和删除文章的规范。Micropub 主要关注于在网站上创建“文章”(如博文、照片、短消息、评论等内容的独立片段),虽然它也可以用于其它类型的内容。Micropub 规范定义了一种简单的内容创建机制,以及更为详细的内容更新和删除机制。
Micropub 规范最初是对 AtomPub 和 MetaWeblog API 的简化版本。AtomPub 是用于在 Atom feed 中创建内容的 API,而 Micropub 则是用于在 [Microformats2] feed 中创建内容的 API。
除了采用与 AtomPub 和 MetaWeblog 不同的词汇表外,Micropub 还在许多方面简化和改进了这两种 API。Micropub 使用 OAuth 2.0 Bearer Token 进行认证,而不是以往不安全的用户名/密码认证方式。Micropub 也支持传统表单提交以及 JSON 提交,比 XMLRPC 方法更简单、更安全。
Micropub 的词汇表直接来源于 [Microformats2] 词汇表。Micropub 旨在实现一种可通过 HTTP POST 提交的 Microformats 序列化方式。开发新的 Micropub 词汇表的方法是查看 Microformats 的表示形式并反向推导。
本文件中的 "必须"、"禁止"、"要求"、"应当"、"不应"、" 推荐"、"不推荐"、 "建议"、"可以" 以及 "可选" 应当按照 [RFC2119] 中的定义进行解释。
本节描述了 Micropub 客户端和服务器的一致性标准。所有实现 必须 支持 UTF-8 编码。
符合规范的 Micropub 发布客户端需:
符合规范的 Micropub 编辑客户端需:
符合规范的 Micropub 服务器需:
本规范的退出 CR 标准是每项功能至少有两个独立且可互操作的实现。不同的功能可由不同的产品实现。不要求所有功能都由同一产品实现。为实现此标准,定义如下术语:
Micropub 客户端指能向服务器发送 Micropub 请求以创建或操作文章的实现。一致性标准见上文一致性类别。
Micropub 服务器指可根据 Micropub 请求创建,或可选地编辑、删除文章的实现。Micropub 服务器 可以 同时支持用于文件上传的媒体端点(Media Endpoint)。一致性标准见上方一致性类别。
每个实现必须由不同的团队开发,不得共享、复用或派生自其他合格实现的代码。与本规范实现无关的代码可不受此限制。
当服务器按功能要求执行客户端的请求操作、客户端从服务器获得预期响应,且服务器也按要求向客户端返回响应时,则认为某单项功能的客户端和服务器实现可互操作。
Micropub 实现指满足以下所有条件的客户端或服务器:
为评估退出标准,每项下列内容视为一个功能:
Authorization 头部包含访问令牌认证请求x-www-form-urlencoded 请求体包含访问令牌认证请求x-www-form-urlencoded 语法和一个或多个属性创建文章x-www-form-urlencoded 语法为同一属性名创建多个值的文章multipart/form-data 方式向 Micropub 端点发送请求并上传文件创建文章HTTP 201 Created 及 Location 头部HTTP 202 Created 及 Location 头部HTTP 200 OKHTTP 201 CreatedHTTP 204 No Contentx-www-form-urlencoded 语法删除文章x-www-form-urlencoded 语法取消删除(undelete)文章q=config 查询 Micropub 端点以获取媒体端点和联合发布目标(如有)q=syndicate-to 查询 Micropub 端点以获取联合发布目标列表请在 https://micropub.net/implementation-reports/ 提交你的实现报告。页面中有详细说明。实现报告模板参见 micropub.rocks 所提供的测试。
micropub.rocks 提供了丰富的测试用例,可用于现场测试你的实现,对实现 Micropub 过程中遇到错误时也能获得详细情况反馈,是开发 Micropub 实现的实用工具。
由于 [microformats2-parsing] 对于将 HTML 文档解析为数据结构的规则集相对较小,Micropub 同样定义了一套较小的规则,用以将 HTTP POST 和 GET 请求解释为 Micropub 命令。和 [microformats2-parsing] 一样,在引入新属性(如 [h-entry])时不需要更改解析规则,Micropub 也不要求更改解析规则来处理可能对应不同文章类型(如发布视频和“点赞”)的请求。
Micropub 语法描述了如何将 HTTP POST 和 GET 请求解释为有用的服务器操作。
所有用于创建文章的 Micropub 请求都采用 UTF-8
x-www-form-urlencoded、
multipart/form-data
[HTML5],或 [JSON] 编码的 HTTP 请求发送。通常响应不带响应体,所需信息(如创建的文章 URL)通过 HTTP 头部返回。如需响应体,推荐 返回 [JSON]
编码对象。
针对 x-www-form-urlencoded 和
multipart/form-data 请求,Micropub 扩展了标准的 URL 编码,增加了对多值属性的显式指示。即,如果需要对某属性发送多个值,必须
在属性名后加上方括号 []。
例如,要给 "category" 属性指定多个值,请求中应为
category[]=foo&category[]=bar。
服务器端应将其转换为内部数组结构。对应的 JSON 表达例如下:
{
"category": [
"foo",
"bar"
]
}
在多部分请求中同样适用,每个值给在请求的独立“部分”,并使用类似
Content-Disposition: form-data; name="category[]" 的行指明名称。
注意,对 x-www-form-urlencoded
语法的唯一扩展就是增加方括号以表示数组。不支持 foo[0] 和 foo[bar] 这种语法,因此对于更复杂的对象,客户端应使用 JSON 语法 提交。
当请求采用 x-www-form-urlencoded 或 multipart/form-data
发送时,有一些属性名是保留的。
access_token - OAuth Bearer 令牌用于认证请求(可放在 HTTP
Authorization 头部或者以此表单参数提交)h - 指定要创建的对象类型action - 指明本次操作是 delete 或
undelete(表单编码语法下不支持 update 操作)
url - 指明操作的对象 URLmp-* - 保留作将来扩展使用 x-www-form-urlencoded 或 multipart/form-data
创建文章时,请求中的其它属性都视为要创建对象的属性。
服务器 禁止 将 access_token
属性存入文章中。
以 mp-
开头的属性保留给客户端用于向服务器下达命令。通常文章属性对用户可见,而命令对服务器可见,设置文章属性不适用于命令。希望扩展 mp- 命令的客户端和服务器可在 indieweb.org/Micropub-extensions 讨论并文档化实现方案。
使用 JSON 语法 创建文章时,以 mp- 开头的属性同样依上述保留。
要创建一篇文章,应向 Micropub 端点发送 HTTP POST 请求,指明要创建的文章类型和具体属性。如果未指定类型,则默认应采用 [h-entry] 类型。客户端和服务器 必须
支持使用 x-www-form-urlencoded 语法创建文章,也 可以 支持 JSON 语法创建文章。
h={Microformats object type}
例如:h=entry
所有不以“mp-”开头的参数均为创建对象的属性。
例如:content=hello+world
如需为某属性(如 h-entry 的多个分类)指定多个值,应在属性名后加方括号表示该值为数组。
例如:category[]=foo&category[]=bar
可接受多值的属性 必须 也兼容只带单个值(可带方括号或不带)。如下是 form-encoded 请求完整样例。
h=entry&content=hello+world&category[]=foo&category[]=bar
上传文件时,客户端 必须 检查是否存在 媒体端点。如无媒体端点,则可假定 Micropub 端点可直接接收文件,并可直接向其发起请求。上传文件时,整个请求采用
multipart/form-data 格式,并以标准属性名发送文件。
例如,要上传一张带标题的照片,需发送包含 h、content 和
photo 三个部分的请求。
multipart/form-data; boundary=553d9cee2030456a81931fb708ece92c
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="h"
entry
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="content"
Hello World!
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="photo"; filename="aaronpk.png"
Content-Type: image/png
Content-Transfer-Encoding: binary
... (binary data) ...
--553d9cee2030456a81931fb708ece92c--
对于支持文件上传的属性(如 photo 或 video),Micropub 端点 必须 也接受 URL 值,并将其视同于直接上传。端点 可以 通过 [Fetch] 下载该 URL
的文件副本,并与直接上传存储一致。例如:
h=entry&content=hello+world&photo=https%3A%2F%2Fphotos.example.com%2F592829482876343254.jpg
这是为了支持通过媒体端点或通过引用其它外部图片进行文件上传。更多信息见 媒体端点 章节。
为支持属性的更复杂取值,你可以以 JSON 语法在解析后的 Microformats 2 JSON 格式中发送数据创建文章。
注意此时不能直接上传文件,只能按照前述以 URL 形式引用文件。
使用 JSON 格式创建文章时,所有值 必须以数组形式指定,即使只有一个值,与
Microformats 2 JSON 格式一致。请求需声明内容类型为 application/json。
以 mp- 开头的属性依 保留属性 规定保留。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": ["hello world"],
"category": ["foo","bar"],
"photo": ["https://photos.example.com/592829482876343254.jpg"]
}
}
如需为上传的图片添加 alt 文本,可以用 Microformats 2 语法为 photo 属性同时指定图片 URL 和 alt
文本。此时值不是简单 URL,而是包含 value(URL)和 alt(文本)两个属性的对象。由于 photo
需要对象型值,不能用 form-encoded 或 multipart 请求实现。请先将图片上传至媒体端点,再在 JSON 请求中引用 URL,如下所示。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": ["hello world"],
"category": ["foo","bar"],
"photo": [
{
"value": "https://photos.example.com/globe.gif",
"alt": "Spinning globe animation"
}
]
}
}
此处补充 alt 文本的方法假设 Microformats 2 关于图片 alt 文本表示的提案(issue 2)将被采纳。如其最终归纳方式不同,Micropub 规范也应相应调整。
如非必要,应尽量避免使用嵌套 Microformats 对象。更优做法是通过 URL 引用对象。例如在签到或标记照片时引用 h-card 场所等对象,建议先创建对象并用其 URL 引用。
这种方式使每个创建的对象都拥有独立 URL(即每条数据都有自己的链接),也方便服务器单独处理各个实体。例如某场所已存在时可以返回已有对象的链接,也可能先合并新数据再返回。
如果嵌套对象没有 URL 意义,比如发布 h-measure 类型值时,无需为 h-measure 分配 URL,这时可接受使用嵌套对象语法。
嵌套对象要求请求采用 JSON 格式,因为表单编码语法无法一致支持嵌套对象。
下例新建一条“体重”记录(h-entry 类型),其 weight 和
bodyfat 属性为 h-measure 嵌套对象。
{
"type": ["h-entry"],
"properties": {
"summary": [
"Weighed 70.64 kg"
],
"weight": [
{
"type": ["h-measure"],
"properties": {
"num": ["70.64"],
"unit": ["kg"]
}
}
],
"bodyfat": [
{
"type": ["h-measure"],
"properties": {
"num": ["19.83"],
"unit": ["%"]
}
}
]
}
}
Micropub 请求中的自然语言内容 可以 包含双向文本。Micropub 文本值的默认基方向为从左到右。若需修改某自然语言值的基方向,可以 按如下方式操作。
如指定自然语言文本的双向属性,且首个强方向字符(参见 [BIDI])不足以判断文本基方向,客户端 推荐 显式指定方向,可在值前加相应 Unicode 控制字符,也可对 HTML 值使用 HTML 方向标记。
支持包含双向文本的自然语言值的 Micropub 服务器 推荐 通过以下方式识别值的基方向:对纯文本,扫描首个强方向字符;HTML 值则优先用方向标记,否则扫描不在标签内的首个强方向字符。显示这些自然语言内容时,服务器 必须 按 [BIDI] 算法决定内容渲染是否需包裹额外控制字符或标签,以正确应用基方向。
如果请求中包含服务器未识别的属性,必须 忽略这些属性,并仅用已识别的属性创建文章。
这样客户端便可向支持丰富内容类型的服务器发送丰富内容,同时也能向不支持的服务器发送降级内容。
例如,客户端可创建包含体重测量的文章,weight 属性用
h-measure,summary 属性加摘要。服务器如不识别 weight 则直接忽略,仅根据 summary 创建纯文本文章。
文章创建成功后,Micropub 端点 必须 返回
HTTP 201 Created 或 HTTP 202 Accepted 状态码,并且 必须 返回 Location 头部,指明创建内容的 URL。[RFC2616]
HTTP/1.1 201 Created
Location: https://aaronpk.example/post/1000
如端点选择异步处理请求而非立即创建并保存文章,则 必须 返回
HTTP 202 Accepted 状态码,并且 必须 返回
Location 头部。服务器 必须 同步完成所有校验,确保对象可成功创建后再返回 HTTP
202。若收到 HTTP 202,客户端应预期该 URL 在稍后会存在。
如果目标站点还提供短链,或已将文章联合发布到其它位置,Micropub 端点 可以 通过 HTTP Link 头部和合适的 "rel" 值返回其它 URL。例如,可用如下响应返回一篇文章的短链:
Link: <http://aaron.pk/xxxxx>; rel="shortlink"
或返回联合发布文章位置:
Link: <https://myfavoritesocialnetwork.example/aaronpk/xxxxxx>; rel="syndication"
具体错误响应的方式见下方 "错误响应" 章节。
Micropub 服务器 推荐 支持文章更新,包括新增和移除各属性如本节所述。
更新条目采用 JSON POST,描述要修改的内容。
要更新条目,应发送 "action": "update" 并通过 "url" 属性给出要更新的条目 URL。必须 还包含
replace、
add 或 delete 属性(或组合),含所需更新内容。
在 replace、add 或 delete 下的各属性值 必须 是数组,即使只有一个值也是如此。
虽然可在同一请求中混合 add/delete 操作,但必须分别作用于不同的属性-值组合。若为同一属性-值组合操作多个,服务器行为未定义。
替换该属性所有值。若属性不存在,则新建该属性。
{
"action": "update",
"url": "https://aaronpk.example/post/100",
"replace": {
"content": ["hello moon"]
}
}
这样将整条内容替换为新文本,其他已存在属性不变。
如已有属性值则保持不变,只追加新值。如无则新建该属性。
使用场景:文章发布后再添加联合发布链接,例如先发布后再联合到 MyFavoriteSocialNetwork 或 Wikimedia,此时需要向原文追加新的联合发布 URL。
要添加联合发布 URL,在更新请求中追加一个或多个 URL。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"add": {
"syndication": ["http://web.archive.org/web/20040104110725/https://aaronpk.example/2014/06/01/9/indieweb"]
}
}
使用场景:文章已创建后补充标签。
为某属性(如 category)添加多个值,直接以数组形式提供。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"add": {
"category": ["micropub","indieweb"]
}
}
存在该属性时,将其完全移除。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"delete": ["category"]
}
对于多值属性(如分类),可按值单独移除。当没有剩余值时该属性被完全移除。
{
"action": "update",
"url": "https://aaronpk.example/2014/06/01/9/indieweb",
"delete": {
"category": ["indieweb"]
}
}
服务器 必须 对成功的更新请求返回 HTTP 200、201 或
204。如果更新导致文章 URL 变更,服务器 必须 返回 HTTP 201,并在 HTTP
Location 头部附上新 URL。否则应返回 200 或 204,视响应体是否含内容而定。响应体不是必须的,但 可以 包含描述变更的 JSON 对象。
Micropub 服务器推荐支持删除文章,可以支持恢复(undelete)文章。
如需删除某个 URL 的整条内容,请发送包含
action=delete 以及该条内容
url 属性的 POST 请求。
action=delete
&url=https://aaronpk.example/2014/06/01/9/indieweb
{
"action": "delete",
"url": "https://aaronpk.example/2014/06/01/9/indieweb"
}
如需恢复被删除的文章,将 action 值设为 "undelete" 即可。
action=undelete
&url=https://aaronpk.example/2014/06/01/9/indieweb
{
"action": "undelete",
"url": "https://aaronpk.example/2014/06/01/9/indieweb"
}
服务器必须对删除和恢复(undelete)操作的成功请求返回 HTTP 200、201
或 204。如果恢复操作导致文章 URL 发生变化,服务器必须返回 HTTP 201,并在 HTTP
Location 头部包含新 URL。否则,服务器应根据响应体是否有内容返回 200 或 204。响应体可为空,但可以 包含描述本次变更的 JSON 对象。
为提升 Micropub 应用的用户体验,同时解决无法用 JSON 语法上传文件的限制,Micropub 服务器可以支持 “媒体端点”(Media Endpoint)。媒体端点专门用于处理文件上传,并返回一个可在后续 Micropub 请求里使用的 URL。
当 Micropub 服务器支持媒体端点时,客户端可在用户创作其它内容的同时,直接上传照片或其它媒体。下图展示了一个应用在上传图片与填写文字异步进行时的界面流程。
上述用户流程适用于移动端和桌面端。一般来说,提升用户体验的关键是让更多操作异步化,让用户可以继续操作而不是等待系统处理完成。
若 Micropub 端点支持媒体端点,服务器必须在 Micropub 配置请求返回体内用 media-endpoint 键标明媒体端点的完整 URL。客户端禁止假设媒体端点与 Micropub 端点同域。
GET /micropub?q=config
Authorization: Bearer xxxxxxxxx
{
"media-endpoint": "https://media.example.com/micropub"
}
媒体端点必须接受与 Micropub 端点相同的访问令牌。
向媒体端点上传文件,客户端需用 multipart/form-data 格式 POST 请求,其中一个 part 必须命名为
file。媒体端点可以 忽略客户端建议的文件名。
multipart/form-data; boundary=553d9cee2030456a81931fb708ece92c
--553d9cee2030456a81931fb708ece92c
Content-Disposition: form-data; name="file"; filename="sunset.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
... (binary data) ...
--553d9cee2030456a81931fb708ece92c--
在创建包含图片的文章时,如需传递图片的无障碍信息(如 alt 文本),应将 alt 文本与文章内容关联,而非与媒体文件本身关联。这类似 HTML 的 img 标签,其中 src 指向媒体文件,alt 属性为描述文本。详见上传带 alt 文本的图片章节。
媒体端点处理完文件上传,可将文件存储在任意后端,并生成该文件的 URL。推荐使用难以猜测的路径(如 UUID)。请求成功时,端点必须 在 HTTP
Location 头返回文件的 URL,并响应 HTTP 201 Created。响应体内容未做规定。
HTTP/1.1 201 Created
Location: https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg
Micropub 客户端随后可在 Micropub 请求中将此 URL 用作“photo”等属性的值。
如果媒体文件在一段时间内未被用于 Micropub 请求,媒体端点可以 定期清理、删除。
媒体端点推荐遵循 Micropub 端点返回错误响应的约定,详见错误响应。
Micropub 客户端可能需要向 Micropub 端点查询其功能,例如查找能展示给用户的联合发布目标列表、或获取文章源数据以便更新界面展示。
查询时,请用 GET 请求 Micropub 端点,通过 q 参数指定想要查询的内容。
Micropub 端点 URL 可能带有诸如 ?micropub=endpoint 的参数。此时,Micropub
客户端必须追加 q 参数,而不是替换原有参数串。
当用户首次登录 Micropub 客户端时,客户端通常需要查询端点初始信息。客户端推荐用q=config的查询请求获取初步配置信息。
服务器推荐在配置响应中包含以下信息。
syndicate-to(具体格式参见联合发布目标部分)
media-endpoint
GET /micropub?q=config
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"media-endpoint": "https://media.example.com/micropub",
"syndicate-to": [
{
"uid": "https://myfavoritesocialnetwork.example/aaronpk",
"name": "aaronpk on myfavoritesocialnetwork",
"service": {
"name": "My Favorite Social Network",
"url": "https://myfavoritesocialnetwork.example/",
"photo": "https://myfavoritesocialnetwork.example/img/icon.png"
},
"user": {
"name": "aaronpk",
"url": "https://myfavoritesocialnetwork.example/aaronpk",
"photo": "https://myfavoritesocialnetwork.example/aaronpk/photo.jpg"
}
}
]
}
服务器推荐支持配置查询,并返回所有相关属性。若无适用属性,响应推荐为空 JSON:{}。
客户端推荐将异常响应处理为“空响应”,以兼容不支持该查询的服务器。例如服务器完全不实现配置查询时,可能会返回 HTTP 400 而不是 200+空 JSON。
Micropub 客户端可查询端点获取文章的特定属性,从而仅请求所需或已知属性,例如搭建“为文章补加标签”界面。
支持更新文章的服务器必须支持源内容查询。
查询时,请用 GET 请求 Micropub 端点,将 q 设为
source,用 url 指明目标文章。可用 properties 指定属性名列表,多个时用数组格式,依照
[HTML5] URL 编码规则。
端点必须用 [microformats2-parsing][JSON] 格式响应,顶层为 properties 对象,键为请求属性名。若未指定属性,则响应必须返回全部属性,并含 type 属性说明词汇表类型。
GET /micropub?q=source&properties[]=published&properties[]=category&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"properties": {
"published": ["2016-02-21T12:50:53-08:00"],
"category": [
"foo",
"bar"
]
}
}
GET /micropub?q=source&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"published": ["2016-02-21T12:50:53-08:00"],
"content": ["Hello World"],
"category": [
"foo",
"bar"
]
}
}
如果文章内容以 HTML 写入,则端点必须将
content 属性以包含 html 键的对象返回。否则应以字符串返回,客户端视为纯文本。此行为与 [microformats2-parsing] 属性一致。
下例为请求 HTML 编辑的文章内容。
GET /micropub?q=source&properties=content&url=https://aaronpk.example/post/1000
Authorization: Bearer xxxxxxxxx
Accept: application/json
HTTP/1.1 200 OK
Content-type: application/json
{
"properties": {
"content": [
{
"html": "<b>Hello</b> <i>World</i>"
}
]
}
}
如需扩展查询操作的功能,鼓励客户端与服务器在 indieweb.org/Micropub-extensions 头脑风暴并文档化实现。
如请求有误,端点必须返回合适 HTTP 状态码(通常为
400、401、403),可以包含错误描述。如果返回错误体,响应体必须为 [JSON] 对象,且至少含有一个名为
error 的属性。错误码如下:
"error":"forbidden" - 认证用户无权限执行此请求。"error":"unauthorized" - 本次请求缺少访问令牌。注意 403
代表有令牌但无权限,401 为完全未提供令牌。"error":"insufficient_scope" - 此令牌 scope
不满足本请求需求,客户端可提示用户重新授权。响应可以包含所需 "scope"。"error":"invalid_request" - 请求缺少必要参数或某参数有误客户端推荐对未知错误字符串视为通用错误。响应体可以含 error_description
属性,其值为为开发者理解错误而写的人类可读描述。此描述非面向最终用户。
更多错误响应细节见 OAuth 2 Bearer Token [RFC6750] 规范。
GET /micropub?q=source&url=https://aaronpk.example/post/404
Authorization: Bearer xxxxxxxx
HTTP/1.1 400 Bad Request
Content-type: application/json
{
"error": "invalid_request",
"error_description": "The post with the requested URL was not found"
}
Micropub 请求中使用的词汇表推荐采用 [Microformats2] 定义的那些词汇表。如果使用 Microformats2 词汇表,客户端和服务器必须至少支持 [h-entry] 词汇表。其它被广泛使用的词汇表包括 [h-event] 和 [h-card]。在创建对象时,该对象使用的词汇表通过参数 h(或在 JSON 语法下为
type)指明。如果未提供 type,服务器应当假定默认值为 entry。
本节为非规范性内容。
要指明要创建的对象,使用名为 h 的属性(这个名字不会用于 Microformats 对象的属性),后面加上
Microformats 对象的名字。例如:
h=entryh=cardh=eventh=cite以下属性可包含在创建新的 [h-entry] 的请求中:
发布带标签的新短消息并联合到 myfavoritesocialnetwork:
POST /micropub HTTP/1.1
Host: aaronpk.example
Authorization: Bearer XXXXXXXXXXX
Content-type: application/x-www-form-urlencoded; charset=utf-8
h=entry
&content=My+favorite+of+the+%23quantifiedself+trackers%2C+finally+released+their+official+API
&category[]=quantifiedself&category[]=api
&mp-syndicate-to=https://myfavoritesocialnetwork.example/aaronpk
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Bearer XXXXXXX
h=entry
&content=Hello+World
curl https://aaronpk.example/micropub -d h=entry -d "content=Hello World" -H "Authorization: Bearer XXXXXXX"
发布带标签的新回复并联合到 myfavoritesocialnetwork:
POST /micropub HTTP/1.1
Host: aaronpk.example
Authorization: Bearer XXXXXXXXXXX
Content-type: application/x-www-form-urlencoded; charset=utf-8
h=entry
&content=%40BarnabyWalters+My+favorite+for+that+use+case+is+Redis.
&in-reply-to=https://waterpigs.example/notes/4S0LMw/
&mp-syndicate-to=https://myfavoritesocialnetwork.example/aaronpk
发布一篇带 HTML 内容的新文章。需要注意,content 属性此时作为带有 html
键的对象发送。这与 Microformats 2 语法中的 HTML 解析内容相对应。由于 content 是对象类型,请求必须采用 JSON 格式发送。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"name": ["Itching: h-event to iCal converter"],
"content": [
{"html": "Now that I've been <a href=\"https://aaronparecki.com/events\">creating a list of events</a> on my site using <a href=\"https://p3k.io\">p3k</a>, it would be great if I could get a more calendar-like view of that list..."}
],
"category": [
"indieweb", "p3k"
]
}
}
要创建带有嵌入图片的文章,文章的 HTML 应包含 <img> 标签,src
为上传至媒体端点后返回的图片 URL。
首先,将一个或多个图片上传到媒体端点。一般此步骤会在文章正式发布前发生,比如用户在富文本编辑器中写作时,编辑器可以一边将用户拖入的图片上传到媒体端点,一边将图片用结果 URL 嵌入编辑器内容。相关请求示例见 上传到媒体端点 示例。
将文件上传到媒体端点后,响应中会返回一个 URL,客户端可在发布文章时使用该 URL。
HTTP/1.1 201 Created
Location: https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg
客户端便可用此 URL 将图片嵌入到文章中。
POST /micropub HTTP/1.1
Host: aaronpk.example
Content-type: application/json
{
"type": ["h-entry"],
"properties": {
"content": [
{"html":"<p>Hello World</p><p><img src=\"https://media.example.com/file/ff176c461dd111e6b6ba3e1d05defe78.jpg\"></p>"}
]
}
}
当 Micropub 请求中包含文件时,整个请求体采用 multipart/form-data
编码,并用词汇表中属性名(如 audio、video 或 photo)作为文件字段名。一个请求可以有一个或多个这样的文件。
例如,某服务可以把视频发在 video 属性,并把该视频截帧图片作为 photo 属性。
在 PHP 中,可通过 $_FILES 数组访问这些文件:
$_FILES['video']
$_FILES['photo']
$_FILES['audio']
需要注意,JSON 编码请求体无法上传文件。请改为先把照片上传到媒体端点,然后在 JSON 请求里用其 URL。
Micropub 端点可以直接保存文件,也可以发送到其它后端存储(如 Amazon S3)进行保存。
Micropub 端点在接收照片或其它媒体时,可能遇到客户端提交的文件 URL 来自于非 Micropub 端点或媒体端点的域名,比如客户端提供了自己的文件上传机制。Micropub 服务器可以采取防御性措施,只从受信任域名(如服务器自身域名及其媒体端点)下载和存储媒体文件,否则仅保存文件的 URL。
下列问题基于自我评估问卷:安全与隐私([security-privacy-questionnaire] ),对本规范的安全与隐私注意事项做了概览。
IANA 已依 [RFC5988] 第 6.2.1 节登记了如下链接关系类型:
本节为非规范性内容。
本节为非规范性内容。
你可以在 micropub.net 上查阅 Micropub 实现列表
编辑感谢 IndieWeb 社区和所有实现者的支持、鼓励和热情。特别致谢: Amy Guy、 Barry Frost、 Benjamin Roberts、 Chris Webber、 Christian Weiske、 David Shanske、 Emma Kuo、 Kyle Mahan、 Jeena Paradies、 Malcolm Blaney、 Martijn van der Ven、 Marty McGuire、 Mike Taylor、 Pelle Wessman、 Ryan Barrett、 Sandro Hawke、 Sven Knebel、以及 Tantek Çelik。
本节为非规范性内容。
本节罗列了2017年4月13日 PR到本版本的变更。
q 参数,从保留 POST 属性列表中删去(因其不用在
POST 请求里)。mp- 属性也是保留。本节罗列了2016年10月18日 CR到2017年4月13日 PR的变更。
multipart/form-data 请求以接收媒体内容。
x-www-form-urlencoded 和
multipart/form-data 统一拼写及代码高亮。
本节罗列了2016年8月16日 CR到2016年10月18日 CR的变更。
not_found 去除,由要求三个推荐值替代,并允许服务器自定义更多错误类型
本节罗列了2016年7月13日 WD到2016年8月16日 CR的变更。
本节罗列了2016年6月21日 WD到2016年7月13日 WD的变更。
mp-action 改为
action,因仅 update 用 JSON 请求
本节罗列了2016年5月4日 WD到2016年6月21日 WD的变更。
access_token 值
本节罗列了2016年3月1日 WD到2016年5月4日 WD的变更。
properties
嵌套
本节罗列了2016年1月28日 FPWD到2016年3月1日 WD的变更。
1.1 社交网络工作组
Micropub 是由社交网络工作组制定的多个相关规范之一。对替代方案和互补协议感兴趣的实现者应查阅 ActivityPub,以及总览文档 [social-web-protocols]。