跳到主要内容

6. 接收某订阅的推送消息

6. 接收某订阅的推送消息​

用户代理 (user agent) 通过对推送消息订阅资源发起 GET 请求来请求投递新推送消息. 推送服务不对此请求作出响应, 而是使用 HTTP/2 服务器推送 [RFC7540] 在应用服务器发送推送消息时发送推送消息内容.

用户代理可以 (MAY) 在请求中包含 Urgency 头字段. 推送服务禁止 (MUST NOT) 投递紧急程度低于该头字段所定义值的消息, 定义见表 1 (说明性紧急程度取值).

每条推送消息作为在 PUSH_PROMISE 中发送的合成 GET 请求的响应被推送. 该 GET 请求发往应用服务器请求消息投递时由推送服务创建的推送消息资源. 响应头应当 (SHOULD) 在类型为 urn:ietf:params:push 的链接关系中提供与推送消息订阅对应的推送资源 URI. 响应体是应用服务器向推送资源发送的最近一次请求的实体体.

下列示例请求通过 HTTP/2 发送:

HEADERS      [stream 7] +END_STREAM +END_HEADERS
:method = GET
:path = /subscription/LBhhw0OohO-Wl4Oi971UG
:authority = push.example.net

推送服务允许该请求保持未决. 当应用服务器发送推送消息时, 在与初始请求关联的情况下生成服务器推送. 服务器推送的响应包含推送消息.

PUSH_PROMISE [stream 7; promised stream 4] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 4] +END_HEADERS
:status = 200
date = Thu, 11 Dec 2014 23:56:56 GMT
last-modified = Thu, 11 Dec 2014 23:56:55 GMT
cache-control = private
link = </push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV>;
rel="urn:ietf:params:push"
content-type = text/plain;charset=utf8
content-length = 36

DATA [stream 4] +END_STREAM
iChYuI3jMzt3ir20P8r_jgRR-dSuN182x7iB

HEADERS [stream 7] +END_STREAM +END_HEADERS
:status = 200

用户代理还可通过在 Prefer 头字段 [RFC7240] 中将 wait 偏好设为 0 来立即请求推送消息订阅资源的内容. 对此请求, 推送服务必须 (MUST) 为所有尚未投递的推送消息生成服务器推送.

不带关联服务器推送的 204 (No Content) 状态码表示当前没有可用消息. 这可能是因为推送消息已过期.

6.1. Receiving Push Messages for a Subscription Set (为订阅集合接收推送消息)​

为单个订阅与为订阅集合接收推送消息之间存在细微差别. 若订阅集合可用, 用户代理应当 (SHOULD) 使用订阅集合监视推送消息, 而非各个推送消息订阅.

用户代理通过对推送消息订阅集合资源发起 GET 请求, 请求为一组推送消息订阅投递新推送消息. 推送服务不对此请求作出响应, 而是使用 HTTP/2 服务器推送 [RFC7540] 在应用服务器发送推送消息时发送推送消息内容.

用户代理可以 (MAY) 在请求中包含 Urgency 头字段. 推送服务禁止 (MUST NOT) 投递紧急程度低于该头字段所定义值的消息, 定义见表 1 (说明性紧急程度取值).

每条推送消息作为在 PUSH_PROMISE 中发送的合成 GET 请求的响应被推送. 该 GET 请求发往应用服务器请求消息投递时由推送服务创建的推送消息资源. 合成请求必须 (MUST) 在类型为 urn:ietf:params:push 的链接关系中提供与推送消息订阅对应的推送资源 URI. 使用户代理能够区分消息来源. 响应体是应用服务器向推送资源发送的最近一次请求的实体体.

下列示例请求通过 HTTP/2 发送.

HEADERS      [stream 7] +END_STREAM +END_HEADERS
:method = GET
:path = /subscription-set/4UXwi2Rd7jGS7gp5cuutF8ZldnEuvbOy
:authority = push.example.net

推送服务允许该请求保持未决. 当应用服务器发送推送消息时, 在与初始请求关联的情况下生成服务器推送. 服务器推送的响应包含推送消息.

PUSH_PROMISE [stream 7; promised stream 4] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 4] +END_HEADERS
:status = 200
date = Thu, 11 Dec 2014 23:56:56 GMT
last-modified = Thu, 11 Dec 2014 23:56:55 GMT
link = </push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV>;
rel="urn:ietf:params:push"
cache-control = private
content-type = text/plain;charset=utf8
content-length = 36

DATA [stream 4] +END_STREAM
iChYuI3jMzt3ir20P8r_jgRR-dSuN182x7iB

HEADERS [stream 7] +END_STREAM +END_HEADERS
:status = 200

用户代理可通过在 Prefer 头字段 [RFC7240] 中将 wait 偏好设为 0 来立即请求推送消息订阅集合资源的内容. 对此请求, 推送服务必须 (MUST) 为所有尚未投递的推送消息生成服务器推送.

不带关联服务器推送的 204 (No Content) 状态码表示当前没有可用消息. 这可能是因为推送消息已过期.

6.2. Acknowledging Push Messages (确认推送消息)​

为确保推送消息至少一次正确投递给用户代理, 用户代理必须 (MUST) 通过对推送消息资源执行 HTTP DELETE 来确认收到消息.

DELETE /message/qDIYHNcfAIPP_5ITvURr-d6BGt HTTP/1.1
Host: push.example.net

若推送服务收到确认且应用已请求投递回执, 推送服务必须 (MUST) 向监视回执订阅的应用服务器返回 204 (No Content) 响应.

若推送服务在合理时间内未收到确认, 则认为消息尚未投递. 推送服务应当 (SHOULD) 继续重试投递消息直至其公布的过期时间.

推送服务可以 (MAY) 在公布的过期时间之前因用户代理无响应或运维约束等情况停止重试投递. 若应用已请求投递回执, 推送服务必须 (MUST) 向监视回执订阅的应用服务器返回 410 (Gone) 响应.

6.3. Receiving Push Message Receipts (接收推送消息回执)​

应用服务器通过对回执订阅资源发起 HTTP GET 请求来请求从推送服务接收回执. 推送服务不对此请求作出响应, 而是使用 HTTP/2 服务器推送 [RFC7540] 在用户代理确认 (第 6.2 节) 消息时发送推送回执.

每条回执作为在 PUSH_PROMISE 中发送的合成 GET 请求的响应被推送. 该 GET 请求发往应用服务器请求消息投递时由推送服务创建的同一推送消息资源. 响应包含表示消息投递结果的状态码且不携带数据.

下列示例请求通过 HTTP/2 发送.

HEADERS      [stream 13] +END_STREAM +END_HEADERS
:method = GET
:path = /receipt-subscription/3ZtI4YVNBnUUZhuoChl6omUvG4ZM
:authority = push.example.net

推送服务允许该请求保持未决. 当用户代理确认消息时, 推送服务向应用服务器推送投递回执. 204 (No Content) 状态码确认消息已投递并已确认.

PUSH_PROMISE [stream 13; promised stream 82] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 82] +END_STREAM
+END_HEADERS
:status = 204
date = Thu, 11 Dec 2014 23:56:56 GMT

若用户代理未能确认收到推送消息, 且推送服务在公布的过期时间之前停止重试投递, 则推送服务必须 (MUST) 推送状态码为 410 (Gone) 的失败响应.