Copyright © 2020-2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本仕様は、プロファイリング機構および一連の プロファイルを定義する。これらは、そのまま使える 相互運用性を、Web Things と、そのConsumersとの間で、Web of Things 上において可能にする。
そのまま使える相互運用性があるとは、ある Profileに 適合する任意のConsumerが、 同じProfileに適合する任意のThingと、追加の カスタマイズなしに相互作用できることを意味する。
Profile は、適合するConsumersおよびThingsが従わなければならない一連の アサーションを提供する技術仕様である。
プロファイリング機構は、ある Thing が 1 つ以上の
Profilesに適合していることを示す手段を提供する。これは、その
Profilesの識別子を、その
Thing
Description の profile メンバーで参照することによって行う。
本仕様は 3 つのプロファイルを定義する。
本仕様で定義されるProfilesは、 一連の共通制約を共有し、それらの Profilesの実装もこれに適合しなければならない。これには、単位、日付形式、セキュリティ 機構、発見機構、リンク関係、および エラーに関する制約が含まれる。
本仕様の将来のバージョン、または拡張 仕様では、追加のProfilesを定義することがある。
この節は、公開時点におけるこの文書のステータスを説明する。現在の W3C 公開物の一覧および この技術報告の最新改訂版は、 W3C 標準および草案 インデックスで確認できる。
この文書は、Web of Things Working Group により、Recommendation track を用いる Working Draft として公開された。
Working Draft としての公開は、 W3C およびその メンバーによる承認を意味しない。
これは草案文書であり、いつでも他の文書によって更新、置換、または 廃止される可能性がある。この文書を作業中のもの以外として 引用することは適切ではない。
この文書は、 W3C Patent Policy の下で運営されるグループによって作成された。 W3C は、 このグループの成果物に関連して行われた 特許開示の公開リストを維持している。 そのページには、特許を開示するための手順も含まれる。ある個人が、本人が Essential Claim(s)を含むと考える特許について実際の知識を有する場合、その個人は W3C Patent Policy の第 6 節に従って情報を開示しなければならない。
この文書は、2025年8月18日版 W3C Process Document によって管理される。
Web of Things (WoT) は、既存の標準化された Web 技術を使用し拡張することによって、Internet of Things (IoT) の断片化に対抗することを目指している。
W3C WoT Thing Description [wot-thing-description11] 仕様は、接続されたデバイスの能力と、それらと通信するための インターフェイスを記述するための情報モデルおよび JSON ベースの 表現形式を定義する。Thing Descriptions は、 プロトコルに依存せず、幅広い既存の(「ブラウンフィールド」)IoT デバイスを記述できるだけの柔軟性を持つように 設計されている。
この水準の柔軟性を提供するため、Thing Description 仕様には、プロトコルバインディング、ペイロードバインディング、 セキュリティ機構、リンク関係、セマンティックコンテキストなど、多数の拡張 ポイントが含まれている。デバイスのすべての能力を Thing Description で記述でき、かつ Consumer が使用されているすべて の拡張を実装している限り、Consumer はそのデバイスと 相互運用できるはずである。しかし、この拡張可能なアーキテクチャの結果として、 任意のConsumer が相互運用できるのは、可能な Web Things の一部に限られる。
本仕様は、Thing Description [wot-thing-description11] 仕様を補完するように設計されており、「Profiles」の使用を通じて アドホックな相互運用性を可能にする。Profile は、ある Thing が制約を受けることのできる、 有限個の拡張とデフォルトを規定し、そのプロファイルを実装する任意の Consumer とのそのまま使える 相互運用性を保証する。
Profiles は、この追加的な相互運用性の水準から恩恵を受けるために、開発者が規範的な プロトコルバインディングと一連の共通制約に適合する自由を持つ、 新規(「グリーンフィールド」)実装向けに特に設計されている。
本仕様の将来のバージョン、または拡張 仕様では、追加のProfilesを定義することがある。
Web of Things Interest Group は、さまざまな 異なる産業を代表する利害関係者から Web of Things の ユースケースを収集した。これには、垂直方向の ドメイン固有のユースケースと、複数の応用分野に 適用される水平方向のユースケースの両方が含まれる [wot-usecases]。
いくつかのドメイン固有の ユースケースは、複数ベンダーのデバイスを容易に統合する必要性に言及している。 これは、「マルチベンダーシステム統合」および「そのまま使える相互運用性」を 必要とするクロスドメイン ユースケースにとって特に重要である。
Profiles の 要件の集合は、これらのユースケースから導出された。
大まかに言えば、そのまま使える相互運用性とは、 Consumer が、Thing 固有のカスタマイズなしに、 Thing のすべての能力を使用できることが保証されている、ということである。
本仕様で使用される、そのまま使える相互運用性の完全な定義には、 複数の層が含まれる。以下の分類は、「H2020 - CREATE-IoT Project - Recommendations for commonalities and interoperability profiles of IoT platforms」 [H2020-CREATE-IoT] 報告書の用語を採用している。以下の定義は、WoT profile の範囲を反映するように 調整されている。
技術的相互運用性は通常、 通信プロトコルと、それらのプロトコルを動作させるために必要な インフラストラクチャに関連付けられる。これは、共通のプロトコル(例: HTTP / TCP/IP) について合意し、必要に応じて追加の明確化を提供することを 意味する。
構文的相互運用性は通常、 データ形式およびエンコーディング、ならびにそれらを圧縮するための 技術に関連付けられる。WoT におけるこれらの形式および エンコーディングの例には、JSON、XML、JSON-LD、UTF-8 ペイロードがある。
意味的相互運用性は、通信 パートナーの振る舞いに関する共通理解に関連する。 プロファイルの文脈では、(同期および非同期の)アクション セマンティクスの共通解釈、共通のイベントモデル、複数の プロパティを設定/取得する方法、書き込み可能なプロパティ、共通のエラーモデルおよび エラーメッセージが含まれる。
自動車および医療機器の意味的相互運用性など、ドメイン固有の オントロジーは、本仕様の範囲を超える。
プロファイルの文脈における組織的相互運用性は、 ある profile に適合する任意のConsumerが、 同じProfileに適合する任意の Thing と、 追加のカスタマイズなしに相互作用できることを意味する。
組織的相互運用性には、セキュリティ、信頼、プライバシーについて 共通に合意されたアプローチも必要である。すなわち、 Consumer には、 これらの共通の条件が適用される場合に限り、Things への アクセスが提供される。
プロファイル仕様の要件を満たす、さまざまなエンジニア、ベンダー、SDO によって作成された デバイスは、追加のカスタマイズなしに、適合する Consumers と統合できる。これは、インフラストラクチャ、地域、 文化をまたいで機能する。
非規範的と明示された節に加えて、本仕様におけるすべての作成 ガイドライン、図、例、および注記は非規範的である。本仕様のそれ以外のすべては 規範的である。
本書におけるキーワード MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, SHOULD, および SHOULD NOT は、ここに示すように すべて大文字で現れる場合に限り、BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈される。
Web Thing (Thing)、 Consumer、 Thing Description、Property、Action、Event、および Protocol Binding などの基本的な WoT 用語は、WoT Architecture 仕様 [wot-architecture11] の Section 3 で定義されている。
Profile に適合するためには、Web Thing は、その Profile の仕様におけるすべての規範的文に 適合しなければならない(MUST)。
ある
Web
Thing が
1 つ以上のProfilesに適合することを示すために、
そのThing
Description は
profile メンバーを含まなければならない(MUST) [wot-thing-description11]。
profile メンバーの
値は、単一のProfileを識別する有効な URI
[RFC3986]
、または複数のProfilesを識別する有効な URI の配列の
いずれかに設定されなければならない(MUST)。
Thing Description
で profile
メンバーを使用するためには、
@context メンバーは、当該文書が Thing
Description 仕様のバージョン 1.1 を使用していることを示すために、
anyURI
https://www.w3.org/2022/wot/td/v1.1 を含まなければならない(MUST)。
[wot-thing-description11]。
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "urn:dev:ops:32473-WoTLamp-1234",
"profile": "https://www.w3.org/2022/wot/profile/http-basic/v1",
"title": "My Lamp",
"description": "A web connected lamp",
...
}
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "urn:dev:ops:32473-WoTLamp-1234",
"profile": [
"https://www.w3.org/2022/wot/profile/http-basic/v1",
"https://www.w3.org/2022/wot/profile/http-sse/v1"
],
"title": "My Lamp",
"description": "A web connected lamp",
...
}
Profile に適合するすべてのThingsおよびConsumersは、 WoT Thing Description 1.1 仕様 [wot-thing-description11] で規定されるアサーションを満たさなければならない(MUST)。 ただし、「TD 1.1 consumers MUST accept TDs satisfying the W3C WoT Thing Description 1.0 [wot-thing-description] specification.」という文言のアサーションは除く。
Profile
は、プロトコルバインディングテンプレート
[wot-binding-templates] からのデフォルトを
再定義すべきではない(SHOULD NOT)。
例えば、profile が HTTP プロトコルバインディングを使用し、HTTP
Binding Template が HTTP プロトコルバインディングにおいて
readproperty 操作の htv:methodName のデフォルト値は
GET であると規定している場合、profile はその値を
POST として再定義すべきではない。
Profile
は、当該Profileを実装していない
Consumer にとって予期しない方法で応答することを、
Thing
に要求すべきではない(SHOULD NOT)。 例えば、Profile は、
queryaction 操作のプロトコルバインディングの詳細を定義することがある。
これは、(WoT Thing Description 1.1
仕様の現在の制限により)Thing Description における
プロトコルバインディングテンプレートを用いて完全に記述することは現時点では不可能であり、
適合するConsumer
によって利用可能であるかもしれないが、Thing
Description に公開されるその他の
アクション関連操作は、当該Profileを実装していない
Consumer が期待する方法で応答するべきである。
Profile に適合していても、 Web Thing が、その Thing Description において、 Profile に記述されているものを超える追加の能力や プロトコルバインディングを記述することは妨げられない。ただし、それらが Profile のすべての規範的アサーションに 適合している必要がある。
Thing Description が、それが記述する Thing がある Profile に適合すると主張しているというだけで、 Consumer は、それが実際に適合していると 仮定すべきではない。例えば、Consumer は、 Thing が特定の操作に対して規定どおりに応答しない場合でも、 正常に回復できるべきである。
以下の節は、本文書によって定義される profiles に適用される。
Thing Descriptions の作成者は、 自分たちの地理的地域で一般的な単位が世界的に適用可能ではなく、 重大な結果を伴う誤解を招く可能性があることを認識すべきである。
値が物理量を持つ場合、
unit を提供することが強くRECOMMENDEDされる。
世界規模の 配備で使用されるデバイスには、メートル法(SI 単位)を使用することが強くRECOMMENDEDされる。
別途規定されない限り、
すべての日付および時刻値は、[RFC3339] で定義される
date-time 形式を使用しなければならない(MUST)。
2022-09-21T23:20:50.52Z
曖昧さを減らすため、RFC 3339 では 時の値として 00 から 23 まで(24 ではない)のみを許可し、 タイムゾーンは UTC に対する数値オフセットとして表すことのみを許可している。 時刻に接尾辞 "Z" が適用される場合、それは UTC オフセット 00:00 を示す。
適合するWeb Things は、以下のセキュリティスキーム [wot-thing-description11] のうち、少なくとも 1 つを使用しなければならない(MUST)。
NoSecuritySchemeBasicSecuritySchemeOAuth2SecurityScheme with the
code or client flow
適合するConsumers は、以下のすべてのセキュリティ スキーム [wot-thing-description11] をサポートしなければならない(MUST)。
NoSecuritySchemeBasicSecuritySchemeOAuth2SecurityScheme with the
code or client flow
ComboSecurityScheme with the
oneOf member containing at least one of the
schemes above
Thing は、複数のセキュリティスキームを 実装してもよい(MAY)。
Thing が複数の
セキュリティスキームをサポートする場合、一度に 1 つの
セキュリティスキームのみが使用を要求されるように、
ComboSecurityScheme を使用して oneOf メンバーにより
それらのスキームを列挙しなければならない(MUST)。
BasicSecurityScheme について、"in" フィールドは、
省略されるか、[wot-thing-description11] で定義される
デフォルト値 "header" を与えられなければならない(MUST)。
BasicSecurityScheme について、"proxy" エンドポイントが与えられていない場合、
"name" フィールドは値 "Authorization" を用いて提供されなければならない(MUST)。
BasicSecurityScheme について、"proxy" エンドポイントが
与えられている場合、"name" フィールドは値
"Proxy-Authorization" を用いて提供されなければならない(MUST)。
適合するConsumers は、実装されたすべての セキュリティスキームについて、WoT Discovery [wot-discovery] 仕様の Security Bootstrapping で定義されるセキュリティブートストラッピングをサポートしなければならない(MUST)。
自身の Thing Description を取得するために認証を必要とする、適合する Things は、 WoT Discovery [wot-discovery] 仕様の Security Bootstrapping で定義されるセキュリティブートストラッピングを実装しなければならない(MUST)。
Web Thing の Thing Description [wot-thing-description11] は、Direct Introduction Mechanism [wot-discovery] によって提供される HTTP URL [RFC9110] を使用して、 Thing Description Server [wot-architecture11] から取得可能でなければならない(MUST)。
links メンバーに、他の Web リソースへの
ハイパーリンクを提供するLinks
[wot-thing-description11]
を含むことができる。この節は、適合するConsumers が特定の方法で
解釈することを期待される、Link の rel メンバーおよび
type メンバーの特定の組み合わせを定義する。
| rel | type | 意味 |
|---|---|---|
icon |
image/* |
Thing を表すアイコン |
alternate |
text/html |
Thing と相互作用するためのユーザーインターフェイス |
service-doc |
text/plain or text/html
or text/pdf |
Thing のユーザーマニュアル |
item |
application/td+json |
対象の Thing は、この Thing の構成要素、またはこの Thing が 表す Things の集合のメンバーである |
collection |
application/td+json |
この Thing は、対象の Thing の構成要素、または対象の Thing が 表す Things のグループである |
Consumer が "rel": "icon" かつ "type": "image/*" のリンクに遭遇し、提供された形式の画像を レンダリングできる場合、そのリンクを Thing のアイコンとして解釈し、 ユーザーに表示すべきである(SHOULD)。
Consumer が "rel": "alternate" かつ "type": "text/html" のリンクに遭遇し、 HTML ページをレンダリングし、ユーザー入力を受け付けることができる場合、そのリンクを Thing のユーザーインターフェイスとして解釈し、ユーザーがそのリンクをたどって HTML ページを表示し、相互作用するための手段を提供すべきである(SHOULD)。
Consumer が "rel": "service-doc" かつ "type": "text/plain"、"type": "text/html"、または "type": "text/pdf" のリンクに遭遇し、提供された形式の文書を レンダリングできる場合、そのリンクを Thing のユーザー マニュアルとして解釈し、ユーザーがそのリンクをたどって ユーザーマニュアルを読むための手段を提供すべきである(SHOULD)。
Consumer が "rel": "item" かつ "type": "application/td+json" のリンクに遭遇し、 Things の階層ツリーをレンダリングできる場合、そのリンクを、対象が現在の Thing の サブ Thing であることを示すものとして解釈し、これをユーザーにとって意味のある方法で レンダリングすべきである。
Consumer が "rel": "collection" かつ "type": "application/td+json" のリンクに遭遇し、 Things の階層ツリーをレンダリングできる場合、そのリンクを、対象が現在の Thing を含む Thing(例: グループ、Things のシステム、または Thing Directory)を記述していることを示すものとして解釈し、これをユーザーにとって 意味のある方法でレンダリングすべきである。
HTTP profiles のプロトコルバインディングで 定義されるいずれかの操作が成功しない場合、 Web Thing は、失敗の理由を記述する HTTP エラー コードを含む HTTP レスポンスを送信しなければならない(MUST)。
エラーレスポンスには、以下の HTTP エラーコードのいずれかを使用することが RECOMMENDED される。
400 Bad Request401 Unauthorized403 Forbidden404 Not Found500 Internal Server Error503 Service UnavailableWeb Thing は、
リダイレクト、キャッシュ、または認証の目的で 3xx ステータスコードで応答してもよい(MAY)。
Web Thing は、
300 Multiple
Choices ステータスコードで応答してはならない(MUST NOT)。
Web Things は、
他の有効な HTTP エラーコード
(例: 418 I'm a teapot)で応答してもよい(MAY)。 Consumers は、他の有効な
HTTP エラーコードを、特別に定義された振る舞いを持たない汎用的な
4xx または 5xx エラーとして解釈してもよい(MAY)。
HTTP エラーレスポンスが 本文を含む場合、その本文の内容は Problem Details 形式 [RFC7807] に適合しなければならない(MUST)。
이 절은 HTTP Basic Profile을 정의하며, 여기에는 속성을 읽고 쓰며, 액션을 호출, 질의 및 취소하기 위한 Protocol Binding이 포함됩니다.
이 profile은 속성을 관찰하고 이벤트를 수신하기 위한 작업을 제공하기 위해 HTTP SSE Profile 또는 HTTP Webhook Profile과 함께 사용할 수 있습니다.
HTTP Basic Profile을 준수하려면 Web Things와 Consumer는 Common Constraints 절의 모든 단언도 준수해야 MUST 합니다.
주어진
Web
Thing이 HTTP Basic Profile을 준수함을 표시하려면, 그 Thing
Description은
https://www.w3.org/2022/wot/profile/http-basic/v1 값을 갖는
profile
멤버 [wot-thing-description11]를
가져야 MUST 합니다.
이 절은 Consumer가 HTTP 프로토콜 [RFC9112]을 통해 JSON [JSON] 페이로드를 사용하여 Web Thing [wot-architecture11]과 통신하는 방식을 설명하는 Protocol Binding을 정의합니다.
HTTP Basic Profile을 준수하는 Consumer 또는 Web Thing은 이 프로토콜 바인딩을 구현해야 MUST 합니다.
이 절 전체에서 제공되는 예제는 다음 Thing Description을 생성하는 Web Thing과 Consumer가 어떻게 통신하는지를 설명합니다:
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "https://mywebthingserver.com/things/lamp",
"profile": "https://www.w3.org/2022/wot/profile/http-basic/v1",
"base": "https://mywebthingserver.com/things/lamp/",
"title": "My Lamp",
"description": "A web connected lamp",
"securityDefinitions": {
"oauth2": {
"scheme": "oauth2",
"flow": "code",
"authorization": "https://mywebthingserver.com/oauth/authorize",
"token": "https://mywebthingserver.com/oauth/token"
}
},
"security": "oauth2",
"properties": {
"on": {
"type": "boolean",
"title": "On/Off",
"description": "Whether the lamp is turned on",
"forms": [{"href": "properties/on"}]
},
"level" : {
"type": "integer",
"title": "Brightness",
"description": "The level of light from 0-100",
"unit": "percent",
"minimum" : 0,
"maximum" : 100,
"forms": [{"href": "properties/level"}]
}
},
"actions": {
"fade": {
"title": "Fade",
"description": "Fade the lamp to a given level",
"synchronous": false,
"input": {
"type": "object",
"properties": {
"level": {
"title": "Brightness",
"type": "integer",
"minimum": 0,
"maximum": 100,
"unit": "percent"
},
"duration": {
"title": "Duration",
"type": "integer",
"minimum": 0,
"unit": "milliseconds"
}
}
},
"forms": [{"href": "actions/fade"}]
}
},
"forms": [
{
"op": ["readallproperties", "writemultipleproperties"],
"href": "properties"
},
{
"op": "queryallactions",
"href": "actions"
}
]
}
Property 값을 읽을 때 사용할 property 리소스의 URL은 Thing Description에서 해당 PropertyAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:
op 멤버가
readproperty 값을 포함합니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은
property 리소스의 URL로 사용되어야 MUST 합니다.
Property 값을 읽으려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
GET으로 설정Accept 헤더는
application/json으로 설정
GET /things/lamp/properties/on HTTP/1.1
Host: mythingserver.com
Accept: application/json
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하고, Consumer가 해당 Property를 읽을 권한이 있으면, Property 값을 성공적으로 읽은 후 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
200으로 설정Content-Type 헤더는
application/json으로 설정
HTTP/1.1 200 OK
Content-Type: application/json
false
Property 값을 쓸 때 사용할 property 리소스의 URL은 Thing Description에서 해당 PropertyAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:
op 멤버가
writeproperty 값을 포함합니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은
property 리소스의 URL로 사용되어야 MUST 합니다.
Property 값을 쓰려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
PUT으로 설정Content-Type 헤더는
application/json으로 설정
PUT /things/lamp/properties/on HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
true
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하고, Consumer가 해당 Property를 쓸 권한이 있으면, property 값을 성공적으로 쓴 후 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
204로 설정HTTP/1.1 204 No Content
모든 Properties 값을 한 번에
읽을 때 사용할 properties 리소스의 URL은
Thing
Description에서 최상위
forms 멤버 내부의 다음 조건을 만족하는
Form을 찾아 얻어야
MUST 합니다:
op 멤버가
readallproperties 값을 포함합니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은
properties 리소스의 URL로 사용되어야
MUST 합니다.
모든 Properties 값을 읽으려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
GET으로 설정Accept 헤더는
application/json으로 설정
GET /things/lamp/properties HTTP/1.1
Host: mythingserver.com
Accept: application/json
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하면, Consumer가 접근 권한을 가진 모든 읽기 가능한 Properties 값을 성공적으로 읽은 후, 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
200으로 설정Content-Type 헤더는
application/json으로 설정
HTTP/1.1 200 OK
Content-Type: application/json
{
"on": false,
"level": 100
}
여러 Properties 값을 한 번에
쓸 때 사용할 properties 리소스의 URL은
Thing
Description에서 최상위
forms 멤버 내부의 다음 조건을 만족하는
Form을 찾아 얻어야
MUST 합니다:
op 멤버가
writemultipleproperties 값을 포함합니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은
properties 리소스의 URL로 사용되어야
MUST 합니다.
여러 properties 값을 한 번에 쓰려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
PUT으로 설정Content-Type 헤더는
application/json으로 설정
PUT /things/lamp/properties HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
{
"on": true,
"level": 50
}
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하면, 요청된 쓰기 가능한 Properties 값을 성공적으로 쓴 후 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
204로 설정HTTP/1.1 204 No Content
readmultipleproperties
작업은 요청 페이로드 형식의 복잡성 때문에, 그리고
readproperty와
readallproperties에 비해 많은 기능을
추가하지 않기 때문에 제외됩니다.
writeallproperties는
writemultipleproperties의 특수한 경우일 뿐이므로
제외됩니다.
Action을 호출할 때 사용할 action 리소스의 URL은 Thing Description에서 해당 ActionAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:
op 멤버의 값이
invokeaction입니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은 action
리소스의 URL로 사용되어야 MUST 합니다.
Web Thing에서 Action을 호출하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
POST로 설정Accept 헤더는
application/json으로 설정
Content-Type 헤더는
application/json으로 설정(action에
입력이 있는 경우에만)
POST /things/lamp/actions/fade HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
Accept: application/json
{
"level": 100,
"duration": 5
}
action에
입력이 없으면 요청의
Content-type 헤더는 설정해서는
SHOULD NOT 안 되며, 본문은
비어 있어야 합니다.
null, 빈 따옴표
("") 또는 빈 중괄호({})와 같은
유효한 JSON 값은 유효한 action 입력일 수 있으며,
"빈" 본문으로 간주되지 않습니다.
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하면 세 가지 응답 형식 중 하나로 응답해야 MUST 합니다:
ActionAffordance의
synchronous 멤버는 true 또는
false로 설정되어야
MUST 합니다.
ActionAffordance [wot-thing-description11]의
synchronous 멤버가 true로 설정되어 있으면
Web Thing은 동기식 액션
응답으로 응답해야 MUST 합니다.
ActionAffordance [wot-thing-description11]의
synchronous 멤버가 false로 설정되어 있으면
Web Thing은
비동기식 액션
응답으로 응답해야 MUST 합니다.
HTTP 요청의
제한 시간 기간(예: 30초에서 120초) 내에 실행이 완료될
것으로 예상되지 않는 장기 실행 actions의 경우,
초기 invokeaction 응답 후
Consumer가 동적으로
생성된 ActionStatus 리소스에 대한
queryaction 작업으로 action 요청의 상태를
계속 모니터링할 수 있도록,
Web Thing은 비동기식 액션 응답으로
응답하는 것이 RECOMMENDED됩니다.
HTTP 요청의 제한 시간 기간 내에 실행이 완료될 것으로 예상되는 단기 actions의 경우, Web Thing은 action이 완료될 때까지 기다렸다가 동기식 액션 응답을 보낼 수 MAY 있습니다.
Web
Thing이 invokeaction 요청에 응답하기 전에
action 실행을 시도하는 중 오류를 만나면, 오류 응답을
보내야 MUST 합니다.
적합한
Consumers는 초기
invokeaction 요청에 대한 세 가지 응답 유형을
모두 지원해야 MUST 합니다.
초기
요청 이후, ActionStatus 리소스에 대한 후속 작업 지원은
OPTIONAL입니다.
비동기식 action 호출 요청의 상태는 다음 멤버를
포함하는 ActionStatus 객체로 표현됩니다:
| 멤버 | 설명 | 할당 | 유형 |
|---|---|---|---|
status |
action 요청의 상태입니다. | 필수 |
string (
pending, running,
completed 또는
failed 중 하나)
|
output |
완료된 action의 출력 데이터(있는 경우)로,
해당
ActionAffordance의 output 데이터
스키마를 준수해야 MUST
합니다.
|
선택 사항 | 임의 유형 |
error |
실패한 action과 관련된 오류 메시지(있는 경우)로,
Problem Details 형식
[RFC7807]의
JSON 직렬화를 사용해야 MUST
합니다(
queryaction 작업에 대한 응답에서만 필요).
|
선택 사항 | object |
href |
queryaction 및
cancelaction 작업에서 사용할 수 있는
ActionStatus 리소스의
[URL]로, 그
URI scheme [RFC3986]은
http 또는
https로 확인되어야
MUST 합니다(
비동기식
액션 응답에만 필요).
|
선택 사항 | string |
timeRequested |
Thing이 action 실행 요청을 수신한 시간을 나타내는 타임스탬프입니다. (날짜 형식 제약은 날짜 형식을 참조하십시오). | 선택 사항 | string |
timeEnded |
Thing이 action 실행을 성공적으로 완료했거나, action 실행에 실패한 시간을 나타내는 타임스탬프입니다. (날짜 형식 제약은 날짜 형식을 참조하십시오). | 선택 사항 | string |
출력이 있는 action에 대해 동기식 액션 응답을 제공하는 경우, Web Thing은 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
200으로 설정Content-Type 헤더는
application/json으로 설정
HTTP/1.1 200 OK
Content-Type: application/json
20
출력이 없는 action에 대해 동기식 액션 응답을 제공하는 경우, Web Thing은 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
204로 설정Content-Type 헤더는 설정하지 않음HTTP/1.1 204 No Content
null, 빈 따옴표
("") 또는 빈 중괄호({})와 같은
유효한 JSON 값은 유효한 action 출력일 수 있으며,
"빈" 본문으로 간주되지 않습니다.
비동기식 액션 응답을 제공하는 경우,
Web Thing은
ActionStatus 리소스의 URL을 포함하는 HTTP 응답을
보내야 MUST 하며, 그
URI
scheme [RFC3986]은
http 또는 https로 확인되어야
MUST 합니다. 응답은
다음을 가져야 MUST 합니다:
201로 설정Content-Type 헤더는
application/json으로 설정
Location 헤더는
ActionStatus 리소스의 URL로 설정
href 멤버가
ActionStatus 리소스의 URL로 설정된
JSON 직렬화된 ActionStatus
객체를 포함하는 본문
HTTP/1.1 201 CREATED
Content-Type: application/json
Location: /things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655
{
"status": "pending",
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655",
"timeRequested": "2021-11-10T11:43:19.135Z"
}
리소스가 제한된 환경에서는 오래된
완료/실패 actions의 ActionStatus 객체를
삭제하여 새로 호출된 actions를 위한 공간을 만들 수
MAY 있습니다.
queryaction 작업은 진행 중인 action 요청의
현재 상태를 질의하는 데 사용됩니다.
Action에 대한
invokeaction 작업에 대해
비동기식 액션
응답을 제공하는
Web
Thing은 그 동일한 Action에 대한
queryaction 작업도 지원해야
MUST 합니다.
Action에 대한
invokeaction 작업에 대해
동기식 액션
응답만 제공하는
Web
Thing은 그 동일한 Action에 대한
queryaction 작업을 지원해서는
SHOULD
NOT 안 됩니다.
queryaction 작업에 사용할
ActionStatus 리소스의 URL은
비동기식 액션
응답의 Location 헤더 또는 그 본문 안의
ActionStatus 객체의 href 멤버에서
얻어야 MUST 합니다.
action 요청의 상태를 질의하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
GET으로 설정ActionStatus 리소스의 URL로 설정
Accept 헤더는
application/json으로 설정
GET /things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655
Host: mythingserver.com
Accept: application/json
Web
Thing이 위 형식을 따르는 HTTP 요청을 수신하고,
Consumer가 해당
ActionStatus 리소스를 질의할 권한이 있으면,
action 요청의 상태를 성공적으로 읽은 후 다음과 같은
HTTP 응답을 보내야 MUST
합니다:
200으로 설정Content-Type 헤더는
application/json으로 설정
ActionStatus 객체를 JSON 직렬화하여 포함하는 본문
HTTP/1.1 200 OK
Content-Type: application/json
{
"status": "running",
"timeRequested": "2021-11-10T11:43:19.135Z"
}
질의된
action이 실행에 실패한 경우,
ActionStatus 객체의
status 멤버는 "failed"로 설정되어야
MUST 합니다. 질의된
action이 실행에 실패한 경우,
error 멤버는 Problem Details 형식
[RFC7807]을 준수하는
추가 오류 정보를 제공할 수 MAY
있습니다.
HTTP/1.1 200 OK
Content-Type: application/json
{
"status": "failed",
"error": {
"type": "https://mythingserver.com/docs/errors/invalid-level",
"title": "Invalid value for level provided",
"invalid-params": [
{
"name": "level",
"reason": "Must be a valid number between 0 and 100"
}
]
},
"timeRequested": "2021-11-10T11:43:19.135Z",
"timeEnded": "2021-11-10T11:43:20.513Z"
}
cancelaction 작업은 진행 중인 action 요청을
취소하는 데 사용됩니다.
Action에 대한
invokeaction 작업에 대해
비동기식 액션
응답을 제공하는
Web
Thing은 그 동일한
Action에 대한
cancelaction 작업도 지원할 수
MAY 있습니다.
Action에 대한
invokeaction 작업에 대해
동기식 액션
응답만 제공하는
Web
Thing은 그 동일한
Action에 대한
cancelaction 작업을 지원해서는
SHOULD
NOT 안 됩니다.
cancelaction 작업에 사용할
ActionStatus 리소스의 URL은
비동기식 액션
응답의 Location 헤더 또는 그 본문 안의
ActionStatus 객체의 href 멤버에서
얻어야 MUST 합니다.
action 요청을 취소하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
DELETE로 설정ActionStatus 리소스의 URL로 설정
DELETE /things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655 HTTP/1.1
Host: mythingserver.com
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하고, Consumer가 해당 action 요청을 취소할 권한이 있으면, action을 성공적으로 취소한 후 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
204로 설정HTTP/1.1 204 No Content
진행 중인 모든 action 요청의 상태를 질의할 때 사용할
actions 리소스의 URL은
Thing
Description에서 최상위
forms 멤버 내부의 다음 조건을 만족하는
Form을 찾아 얻어야
MUST 합니다:
op 멤버가
queryallactions 값을 포함합니다
href 멤버 값의
URI
scheme [RFC3986]이
http 또는 https입니다
contentType 멤버의 값이
application/json입니다
그런 다음 href 멤버의 확인된 값은 actions
리소스의 URL로 사용되어야 MUST 합니다.
진행 중인 모든 action 요청의 상태를 질의하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:
GET으로 설정Accept 헤더는
application/json으로 설정
GET /things/lamp/actions HTTP/1.1
Host: mythingserver.com
Accept: application/json
Web Thing이 위 형식을 따르는 HTTP 요청을 수신하면, Consumer가 접근 권한을 가진 진행 중인 모든 action 요청의 상태를 성공적으로 검색한 후, 다음과 같은 HTTP 응답을 보내야 MUST 합니다:
200으로 설정Content-Type 헤더는
application/json으로 설정
ActionStatus 객체들의 배열이며,
JSON으로 직렬화됩니다.
결과 객체의 각 배열은 가장 최근의 action 요청이 먼저 나타나도록 역시간순으로 정렬되어야 MUST 합니다.
HTTP/1.1 200 OK
Content-Type: application/json
{
"fade": [
{
"status": "completed",
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655",
"timeRequested": "2021-11-10T11:43:19.135Z",
"timeEnded": "2021-11-10T11:43:20.513Z"
},
{
"status": "failed",
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a456-558329",
"timeRequested": "2021-11-10T11:42:15.133Z",
"timeEnded": "2021-11-10T11:42:22.524Z"
},
{
"status": "running",
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a457-434656",
"timeRequested": "2021-11-10T11:41:53.351Z"
},
{
"status": "pending",
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a457-ea9519",
"timeRequested": "2021-11-10T11:39:53.651Z"
}
]
}
cancelaction 작업으로 취소되면, 그
ActionStatus 객체는 삭제되며 보존할 필요가
없습니다. 그 밖의 모든 action 요청에 대해서는
Web Thing이
나중에 queryaction 또는
queryallactions 작업으로 그 상태를
질의할 수 있도록 ActionStatus 객체를 저장한다고
가정합니다. ActionStatus 객체를 무기한
보존할 것으로 기대되지는 않으며, 휘발성 메모리에
저장되거나 주기적으로 정리될 수 있습니다.
ActionStatus 객체를 보존할 시간의 길이는
구현별로 달라질 것으로 예상되며, 애플리케이션별
요구사항이나 리소스 제약에 따라 달라질 수 있습니다.
この節は HTTP SSE Profile を定義する。これには、Server-Sent Events [EVENTSOURCE] を使用して、 Properties を監視し、 Events を待ち受けるための Protocol Binding が含まれる。
この profile は、プロパティを読み書きし、アクションを呼び出し、 問い合わせ、キャンセルするための操作を提供するために、 HTTP Basic Profile と併用してもよい。
HTTP SSE Profile に 適合するためには、Web Things および Consumers は、 共通制約 節にあるすべてのアサーションにも適合しなければならない(MUST)。
ある
Web
Thing が HTTP SSE Profile に適合することを示すためには、その Thing
Description は、値
https://www.w3.org/2022/wot/profile/http-sse/v1 を持つ
profile
メンバー [wot-thing-description11]
を持たなければならない(MUST)。
この節は、Server-Sent Events [EVENTSOURCE] を使用して、 Consumer が Web Thing [wot-architecture11] とどのように通信するかを記述する Protocol Binding を定義する。
HTTP SSE Profile に適合する Consumer または Web Thing は、この プロトコルバインディングを実装しなければならない(MUST)。
この節全体で提供される例は、 Consumer が、次の Thing Description を生成する Web Thing とどのように通信するかを記述している。
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "https://mywebthingserver.com/things/lamp",
"profile": "https://www.w3.org/2022/wot/profile/http-sse/v1",
"base": "https://mywebthingserver.com/things/lamp/",
"title": "My Lamp",
"description": "A web connected lamp",
"securityDefinitions": {
"oauth2": {
"scheme": "oauth2",
"flow": "code",
"authorization": "https://mywebthingserver.com/oauth/authorize",
"token": "https://mywebthingserver.com/oauth/token"
}
},
"security": "oauth2",
"properties": {
"on": {
"type": "boolean",
"title": "On/Off",
"description": "Whether the lamp is turned on",
"forms": [
{
"href": "properties/on",
"op": ["observeproperty", "unobserveproperty"],
"subprotocol": "sse"
}
]
},
"level" : {
"type": "integer",
"title": "Brightness",
"description": "The level of light from 0-100",
"unit": "percent",
"minimum" : 0,
"maximum" : 100,
"forms": [
{
"href": "properties/level",
"op": ["observeproperty", "unobserveproperty"],
"subprotocol": "sse"
}
]
}
},
"events": {
"overheated": {
"title": "Overheated",
"data": {
"type": "number",
"unit": "degree celsius"
},
"description": "The lamp has exceeded its safe operating temperature",
"forms": [{
"href": "events/overheated",
"subprotocol": "sse"
}]
}
},
"forms": [
{
"op": ["observeallproperties", "unobserveallproperties"],
"href": "properties",
"subprotocol": "sse"
},
{
"op": ["subscribeallevents", "unsubscribeallevents"],
"href": "events",
"subprotocol": "sse"
}
]
}
property の値を監視する際に使用する Property リソースの URL は、 対応する PropertyAffordance 内で、次を満たす Form を特定することにより、Thing Description から取得しなければならない(MUST)。
op メンバーが値
observeproperty を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
subprotocol メンバーが
sse の値を持つこと
contentType メンバーの値が
application/json であること
その後、
href メンバーの解決済み値を
property リソースの URL として使用しなければならない(MUST)。
Property を監視するために、Consumer は、Server-Sent Events [EVENTSOURCE] 仕様に従い、property リソースの URL にある Web Thing との接続を開かなければならない(MUST)。
これには、Consumer が Web Thing に対して、次を含む HTTP リクエストを送信することが含まれる。
GET に設定するAccept ヘッダーを
text/event-stream に設定する
Connection ヘッダーを
keep-alive に設定する
GET /things/lamp/properties/level HTTP/1.1
Host: mythingserver.com
Accept: text/event-stream
Connection: keep-alive
JavaScript
[ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される Consumers の場合、Server-Sent
Events 接続は
EventSource コンストラクターを使用して開始できる。
const levelSource = new EventSource('/things/lamp/properties/level');
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が対応する property を 監視する権限を持つ場合、Server-Sent Events [EVENTSOURCE] 仕様に従って Consumer とのオープン接続を維持し、 指定された Property の値が変更されるたびに property 値を Consumer にプッシュしなければならない(MUST)。
これには、Web Thing が最初に Consumer に対して、次を含む HTTP レスポンスを送信することが含まれる。
200 に設定するContent-Type ヘッダーを
text/event-stream に設定する
HTTP/1.1 200 OK
Content-Type: text/event-stream
Web
Thing が Consumer とのオープン接続を持つ間に、
指定された Property の値が変更されるたびに、
Web Thing は Server-Sent Events [EVENTSOURCE]
仕様のイベントストリーム形式を使用して、property 値を
Consumer に送信しなければならない(MUST)。 送信される
各メッセージについて、Web Thing は
event フィールドを
PropertyAffordance の名前に設定し、data
フィールドに、JSON でシリアライズされ、
PropertyAffordance で指定されたデータスキーマに従う property 値を
設定しなければならない(MUST)。
id フィールドは、切断された接続を再確立する際に使用するため、
property 変更の一意な識別子に設定すべきである(SHOULD)(下記参照)。
識別子は、property が変更された時刻を表すタイムスタンプであることが
RECOMMENDED される(日付形式の制約については
日付形式を参照)。
event: level\n
data: 42\n
id: 2021-11-17T15:33:20.827Z\n\n
Consumer と Web Thing
の間の接続が切断された場合(下で定義される unobserve 操作の結果である場合を除く)、
Consumer は、Server-Sent Events
仕様 [EVENTSOURCE] に概説された手順に従って、
接続を再確立しなければならない(MUST)。
接続が再確立されたら、
Web Thing は可能であれば、
Last-Event-ID ヘッダーで
Consumer により指定された最後の変更以降に発生した、
取りこぼされた property 変更を送信すべきである(SHOULD)。
Property 値は
JSON でシリアライズされ、
text/event-stream 形式でシリアライズされた Server-Sent Event の
data フィールドで提供される。
HTTP ヘッダーで使用される text/event-stream コンテンツタイプは
sse サブプロトコルによって暗黙的に示されるものと想定され、
埋め込まれた
application/json コンテンツタイプは Form の
contentType メンバー(デフォルト適用後)で示される。
Property の監視を停止するために、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] で指定されるとおり、 対応する Web Thing との Server-Sent Events 接続を終了しなければならない(MUST)。
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource [EVENTSOURCE]
オブジェクト上の
close() メソッドを使用して終了できる。
levelSource.close();
Web Thing
のすべての properties への変更を監視する際に使用する properties リソースの URL は、
Thing
Description の最上位の
forms メンバー内で、次を満たす
Form
を特定することにより、
Thing
Description から取得しなければならない(MUST)。
op メンバーが値
observeallproperties を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
subprotocol メンバーが
sse の値を持つこと
contentType メンバーの値が
application/json であること
その後、href メンバーの解決済み値を
properties リソースの URL として使用しなければならない(MUST)。
Web Thing のすべての Properties への変更を監視するために、 Consumer は、Server-Sent Events [EVENTSOURCE] 仕様に従い、properties リソースの URL にある Web Thing との接続を開かなければならない(MUST)。
これには、Consumer が Web Thing に対して、次を含む HTTP リクエストを送信することが含まれる。
GET に設定するAccept ヘッダーを
text/event-stream に設定する
Connection ヘッダーを
keep-alive に設定する
GET /things/lamp/properties HTTP/1.1
Host: mythingserver.com
Accept: text/event-stream
Connection: keep-alive
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource コンストラクターを使用して開始できる。
const lampPropertiesSource = new EventSource('/things/lamp/properties');
Web Thing が上記の形式に従う HTTP リクエストを受信した場合、 Server-Sent Events [EVENTSOURCE] 仕様に従って Consumer とのオープン接続を維持し、 監視する権限を持つすべての Properties について、新しい property 値を Consumer にプッシュしなければならない(MUST)。
これには、Web Thing が最初に Consumer に対して、次を含む HTTP レスポンスを送信することが含まれる。
200 に設定するContent-Type ヘッダーを
text/event-stream に設定する
HTTP/1.1 200 OK
Content-Type: text/event-stream
Web
Thing が Consumer とのオープン接続を持つ間に
Property が変更されるたびに、
Web
Thing は Server-Sent Events [EVENTSOURCE]
仕様のイベントストリーム形式を使用して、新しい
property 値を Consumer に送信しなければならない(MUST)。
送信される各メッセージについて、Web Thing は
event フィールドを
PropertyAffordance の名前に設定し、data
フィールドに新しい property 値を設定しなければならない(MUST)。
property データは
PropertyAffordance で指定されたデータスキーマに従わなければならず(MUST)、
JSON でシリアライズされなければならない(MUST)。
id フィールドは、切断された接続を再確立する際に使用するため、
event の一意な識別子に設定すべきである(SHOULD)(下記参照)。
識別子は、
Property が変更された時刻を表すタイムスタンプであることが
RECOMMENDED される
(日付形式の制約については
日付形式を参照)。
event: level\n
data: 42\n
id: 2021-11-17T15:33:20.827Z\n\n
Consumer と
Web Thing の間の接続が切断された場合(下で定義される
unobserveallproperties
操作の結果である場合を除く)、
Consumer は、Server-Sent Events
仕様 [EVENTSOURCE] に概説された手順に従って、
接続を再確立しなければならない(MUST)。
接続が再確立されたら、
Web Thing は可能であれば、
Last-Event-ID ヘッダーで
Consumer により指定された最後の変更以降に発生した、
取りこぼされた property 変更を送信すべきである(SHOULD)。
Property 値は JSON でシリアライズされ、
text/event-stream 形式でシリアライズされた
Server-Sent Event の data フィールドで提供される。
HTTP ヘッダーで使用される
text/event-stream コンテンツタイプは
sse サブプロトコルによって暗黙的に示されるものと想定され、
埋め込まれた
application/json コンテンツタイプは Form の
contentType メンバー(デフォルト適用後)で示される。
すべての properties の監視を解除するために、 Consumer は、 Server-Sent Events 仕様 [EVENTSOURCE] で指定された手順に従い、 Web Thing の properties エンドポイントとの対応する Server-Sent Events 接続を終了しなければならない(MUST)。
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource [EVENTSOURCE]
オブジェクト上の
close() メソッドを使用して終了できる。
lampPropertiesSource.close();
HTTP SSE Profile は、 Consumers が Web Thing により発行されるイベントを購読するための機構として、 Server-Sent Events [EVENTSOURCE] を使用する。
Consumers は、この profile に適合するために、
Server-Sent Events 仕様の
EventSource JavaScript API を実装する必要はない。
任意のプログラミング言語を使用して
event stream を消費してよい。
Event を購読する際に使用する event リソースの URL は、 対応する EventAffordance 内で、次を満たす Form を特定することにより、 Thing Description から取得しなければならない(MUST)。
op メンバーが値
subscribeevent を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
subprotocol メンバーが
sse の値を持つこと
contentType メンバーの値が
application/json であること
その後、
href メンバーの解決済み値を event
リソースの URL として使用しなければならない(MUST)。
Event を購読するために、Consumer は、Server-Sent Events [EVENTSOURCE] 仕様に従い、event リソースの URL にある Web Thing との接続を開かなければならない(MUST)。
これには、Consumer が Web Thing に対して、次を含む HTTP リクエストを送信することが含まれる。
GET に設定するAccept ヘッダーを
text/event-stream に設定する
Connection ヘッダーを
keep-alive に設定する
GET /things/lamp/events/overheated HTTP/1.1
Host: mythingserver.com
Accept: text/event-stream
Connection: keep-alive
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource コンストラクターを使用して開始できる。
const overheatedEventSource = new EventSource('/things/lamp/events/overheated');
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が対応する Event を購読する権限を持つ場合、 Server-Sent Events [EVENTSOURCE] 仕様に従って Consumer とのオープン接続を維持し、 指定された型の events が発行されるときに、event データを Consumer にプッシュしなければならない(MUST)。
これには、Web Thing が最初に Consumer に対して、次を含む HTTP レスポンスを送信することが含まれる。
200 に設定するContent-Type ヘッダーを
text/event-stream に設定する
HTTP/1.1 200 OK
Content-Type: text/event-stream
Web Thing が
Consumer とのオープン
接続を持つ間に、指定された型の event が発生するたびに、
Web Thing は
Server-Sent Events [EVENTSOURCE]
仕様のイベントストリーム形式を使用して、event データを Consumer に送信しなければならない(MUST)。 送信される
各メッセージについて、Web Thing は
event フィールドを
EventAffordance の名前に設定し、data
フィールドに event データ(存在する場合)を設定しなければならない(MUST)。 event
データは、
EventAffordance で指定されたデータスキーマに従わなければならず(MUST)、
JSON でシリアライズされなければならない。
id フィールドは、切断された接続を再確立する際に使用するため、
event の一意な識別子に設定すべきである(SHOULD)(下記参照)。
識別子は、event が発生した時刻を表すタイムスタンプであることが
RECOMMENDED される(日付形式の制約については
日付形式を参照)。
event: overheated\n
data: 90\n
id: 2021-11-16T16:53:50.817Z\n\n
Consumer と Web Thing
の間の接続が切断された場合(下で定義される
unsubscribeevent
操作の結果である場合を除く)、
Consumer は、Server-Sent Events
仕様 [EVENTSOURCE] に概説された手順に従って、
接続を再確立しなければならない(MUST)。
接続が再確立されたら、
Web Thing は可能であれば、
Last-Event-ID ヘッダーで
Consumer により指定された最後の event 以降に発生した、
取りこぼされた events を送信すべきである(SHOULD)。
Event ペイロードは JSON でシリアライズされ、
text/event-stream 形式でシリアライズされた
Server-Sent Event の
data フィールドで提供される。
HTTP ヘッダーで使用される
text/event-stream コンテンツタイプは
sse サブプロトコルによって暗黙的に示されるものと想定され、
埋め込まれた
application/json コンテンツタイプは Form の
contentType メンバー(デフォルト適用後)で示される。
Event の購読を解除するために、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] で指定されるとおり、 対応する Web Thing との Server-Sent Events 接続を終了しなければならない(MUST)。
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource [EVENTSOURCE]
オブジェクト上の
close() メソッドを使用して終了できる。
overheatedEventSource.close();
Web Thing
により発行されるすべての Events を購読する際に使用する events リソースの URL は、
Thing
Description の最上位の
forms メンバー内で、次を満たす
Form
を特定することにより、
Thing
Description から取得しなければならない(MUST)。
op メンバーが値
subscribeallevents を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
subprotocol メンバーが
sse の値を持つこと
contentType メンバーの値が
application/json であること
その後、href メンバーの解決済み値を
events リソースの URL として使用しなければならない(MUST)。
Web Thing により発行される すべての Events を購読するために、 Consumer は、Server-Sent Events [EVENTSOURCE] 仕様に従い、events リソースの URL にある Web Thing との接続を開かなければならない(MUST)。
これには、Consumer が Web Thing に対して、次を含む HTTP リクエストを送信することが含まれる。
GET に設定するAccept ヘッダーを
text/event-stream に設定する
Connection ヘッダーを
keep-alive に設定する
GET /things/lamp/events HTTP/1.1
Host: mythingserver.com
Accept: text/event-stream
Connection: keep-alive
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource コンストラクターを使用して開始できる。
const lampEventsSource = new EventSource('/things/lamp/events');
Web Thing が上記の形式に従う HTTP リクエストを受信した場合、 Server-Sent Events [EVENTSOURCE] 仕様に従って Consumer とのオープン接続を維持し、 購読する権限を持つすべての event 型について、event データを Consumer にプッシュしなければならない(MUST)。
これには、Web Thing が最初に Consumer に対して、次を含む HTTP レスポンスを送信することが含まれる。
200 に設定するContent-Type ヘッダーを
text/event-stream に設定する
HTTP/1.1 200 OK
Content-Type: text/event-stream
Web Thing が
Consumer とのオープン
接続を持つ間に event が発生するたびに、
Web Thing は
Server-Sent Events
[EVENTSOURCE]
仕様のイベントストリーム形式を使用して、event データを
Consumer
に送信しなければならない(MUST)。
送信される各メッセージについて、Web Thing は
event フィールドを
EventAffordance の名前に設定し、data
フィールドに event データ(存在する場合)を設定しなければならない(MUST)。
event データは、
EventAffordance で指定されたデータスキーマに従わなければならず(MUST)、
JSON でシリアライズされなければならない。
id フィールドは、切断された接続を再確立する際に使用するため、
event の一意な識別子に設定すべきである(SHOULD)(下記参照)。
識別子は、event が発生した時刻を表すタイムスタンプであることが
RECOMMENDED される(日付形式の制約については
日付形式を参照)。
event: overheated\n
data: 90\n
id: 2021-11-16T16:53:50.817Z\n\n
Consumer と
Web Thing の間の接続が切断された場合(下で定義される
unsubscribeallevents
操作の結果である場合を除く)、
Consumer は、Server-Sent Events
仕様 [EVENTSOURCE] に概説された手順に従って、
接続を再確立しなければならない(MUST)。
接続が再確立されたら、
Web Thing は可能であれば、
Last-Event-ID ヘッダーで
Consumer により指定された最後の event 以降に発生した、
取りこぼされた events を送信すべきである(SHOULD)。
Event ペイロードは JSON でシリアライズされ、
text/event-stream 形式でシリアライズされた
Server-Sent Event の
data フィールドで提供される。
HTTP ヘッダーで使用される
text/event-stream コンテンツタイプは
sse サブプロトコルによって暗黙的に示されるものと想定され、
埋め込まれた
application/json コンテンツタイプは Form の
contentType メンバー(デフォルト適用後)で示される。
すべての Events の購読を解除するために、 Consumer は、 Server-Sent Events 仕様 [EVENTSOURCE] で指定された手順に従い、 Web Thing の events エンドポイントとの対応する Server-Sent Events 接続を終了しなければならない(MUST)。
JavaScript [ECMASCRIPT]
で実装され、
EventSource インターフェイスを公開するランタイムで実行される
Consumers の場合、Server-Sent
Events 接続は
EventSource [EVENTSOURCE]
オブジェクト上の
close() メソッドを使用して終了できる。
lampEventsSource.close();
この節は HTTP Webhook Profile を定義する。これには、 Protocol Binding が含まれ、Properties を監視し、 Events を Webhooks を使用して待ち受ける。
HTTP Webhook profile は、プロパティを読み書きし、 アクションを呼び出し、問い合わせ、キャンセルするための操作を提供するために、 HTTP Basic Profile と併用してもよい(MAY)。
HTTP Webhook profile は、HTTP SSE Profile の代替イベント機構として 使用してもよい(MAY)。
HTTP Webhook Profile に 適合するためには、Web Things および Consumers は、 共通制約 節にあるすべてのアサーションにも適合しなければならない(MUST)。
HTTP Webhook profile を実装するためには、 Thing と Consumer の両方が、 HTTP クライアントおよび HTTP サーバーの両方として動作でき、ネットワーク越しに互いに アクセス可能でなければならない。これは、すべての配備 シナリオで可能とは限らない。
ある
Web
Thing が
HTTP Webhook Profile に適合することを示すためには、その Thing
Description は、値
https://www.w3.org/2022/wot/profile/http-webhook/v1 を持つ
profile
メンバー [wot-thing-description11]
を持たなければならない(MUST)。
この節は、Consumer と Web Thing が Webhooks を使用して どのように通信するかを記述する Protocol Binding を定義する。
HTTP Webhook Profile に適合する Consumer または Web Thing は、 このプロトコルバインディングを実装しなければならない(MUST)。
この節全体で提供される例は、 Consumer が、次の Thing Description [wot-thing-description11] を生成する Web Thing とどのように通信するかを記述している。
{
"@context": "https://www.w3.org/2022/wot/td/v1.1",
"id": "https://mywebthingserver.com/things/lamp",
"profile": [
"https://www.w3.org/2022/wot/profile/http-webhook/v1",
],
"base": "https://mywebthingserver.com/things/lamp/",
"title": "My Lamp",
"description": "A web connected lamp",
"securityDefinitions": {
"oauth2": {
"scheme": "oauth2",
"flow": "code",
"authorization": "https://mywebthingserver.com/oauth/authorize",
"token": "https://mywebthingserver.com/oauth/token"
}
},
"security": "oauth2",
"properties": {
"on": {
"type": "boolean",
"title": "On/Off",
"description": "Whether the lamp is turned on",
"forms": [
{
"op": "observeproperty",
"href": "properties/on",
"subprotocol": "webhook",
"contentType": "application/json",
"htv:methodName": "POST"
},
{
"op": "unobserveproperty",
"href": "properties/on/{subscriptionID}",
"subprotocol": "webhook",
"htv:methodName": "DELETE"
}
]
},
"level" : {
"type": "integer",
"title": "Brightness",
"description": "The level of light from 0-100",
"unit": "percent",
"minimum" : 0,
"maximum" : 100,
"forms": [
{
"op": "observeproperty",
"href": "properties/level",
"subprotocol": "webhook",
"contentType": "application/json",
"htv:methodName": "POST"
},
{
"op": "unobserveproperty",
"href": "properties/level/{subscriptionID}",
"subprotocol": "webhook",
"htv:methodName": "DELETE"
}
]
},
},
"events": {
"overheated": {
"title": "Overheated",
"data": {
"type": "number",
"unit": "degree celsius"
},
"description": "The lamp has exceeded its safe operating temperature",
"subscription": {
"type": "object",
"properties": {
"callbackURL": {
"type": "string",
"format": "uri",
"description": "Callback URL provided by subscriber for Webhook notifications."
}
}
}
"forms": [
{
"op": "subscribeevent",
"href": "events/overheated",
"subprotocol": "webhook",
"contentType": "application/json",
"htv:methodName": "POST"
},
{
"op": "unsubscribeevent",
"href": "events/overheated/{subscriptionID}",
"subprotocol": "webhook",
"htv:methodName": "DELETE"
}
]
}
},
"forms": [
{
"op": "observeallproperties",
"href": "properties",
"subprotocol": "webhook",
"htv:methodName": "POST"
},
{
"op": "unobserveallproperties",
"href": "properties/{subscriptionID}",
"suprotocol": "webhook",
"htv:methodName": "DELETE"
},
{
"op": "subscribeallevents",
"href": "events",
"subprotocol": "webhook",
"htv:methodName": "POST"
},
{
"op": "unsubscribeallevents",
"href": "events/{subscriptionID}",
"suprotocol": "webhook",
"htv:methodName": "DELETE"
}
]
}
Property の値を監視する際に使用する property リソースの URL は、 対応する PropertyAffordance 内で、次を満たす Form を特定することにより、Thing Description [wot-thing-description11] から取得しなければならない(MUST)。
op メンバーが値
observeproperty を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
contentType メンバーが
application/json の値を持つこと
subprotocol メンバーが
webhook の値を持つこと
その後、href メンバーの解決済み値を
property リソースの URL として使用しなければならない(MUST)。
POST /things/lamp/properties/level HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
{
callbackURL: "https://myconsumer.com/listeners/d629c54e-a919-463b-8680-602a21f91fe9"
}
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が対応する Property を監視する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
HTTP/1.1 201 Created
Location: /things/properties/level/74353483-3997-437a-a4f5-84d03784e517
property 監視サブスクリプションが登録されている間、 監視対象の Property の値に変更が発生するたびに、 Web Thing は、監視している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
POST に設定するContent-Type ヘッダーを
application/json に設定する
rel を self に設定した Link ヘッダー
Date ヘッダー。
[rfc9110] の HTTP
Date 形式を使用する
POST /listeners/d629c54e-a919-463b-8680-602a21f91fe9 HTTP/1.1
Host: myconsumer.com
Date: Fri, 4 Jul 2025 12:48:00 GMT
Content-type: application/json
Link: <https://mythingserver.com/things/mylamp1/properties/level>; rel="self"
90
Consumer が、有効な コールバック URL に対して上記の形式に従う HTTP リクエストを受信した場合、 Web Thing に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
200 OK に設定するHTTP/1.1 200 OK
property の監視サブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
DELETE に設定するobserveproperty
操作中の HTTP レスポンスの
Location ヘッダーで提供された subscription URL に設定する
DELETE /things/properties/level/74353483-3997-437a-a4f5-84d03784e517 HTTP/1.1
Host: mythingserver.com
Web Thing が上記の形式に従う HTTP リクエストを受信し、 提供された URL を持つ property 監視サブスクリプションが存在する場合、 サブスクリプションを正常にキャンセルしたならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
204 No
Content に設定するHTTP/1.1 204 No Content
Web Thing のすべての
Properties の値を監視する際に使用する properties リソースの URL は、
Thing
Description の最上位の
forms メンバー内で、次を満たす
Form
を特定することにより、
Thing
Description [wot-thing-description11]
から取得しなければならない(MUST)。
op メンバーが値
observeallproperties を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
contentType メンバーが
application/json の値を持つこと
subprotocol メンバーが
webhook の値を持つこと
その後、href メンバーの解決済み値を
properties リソースの URL として使用しなければならない(MUST)。
Web Thing のすべての Properties への変更を監視するために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
POST /things/lamp/properties HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
{
callbackURL: "https://myconsumer.com/listeners/aa2d8e1f-dc6a-4fe0-a5c0-a42d9f532699"
}
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が Thing の Properties を監視する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
201 Created に設定するLocation ヘッダーを、
個別の監視サブスクリプションを表す一意の URL に設定する。
これは、後で
Consumer が
すべての
Properties の監視をキャンセルする際に使用する。
HTTP/1.1 201 Created
Location: /things/properties/a84fc5df-2667-4db2-a767-feb4640f2cf7
properties 監視サブスクリプションが登録されている間、 監視可能な任意の Property の値に変更が発生するたびに、 Web Thing は、監視している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
POST に設定するContent-Type ヘッダーを
application/json に設定する
rel を self に設定した Link ヘッダー
Date ヘッダー。
[rfc9110] の HTTP
Date 形式を使用する
POST /listeners/aa2d8e1f-dc6a-4fe0-a5c0-a42d9f532699 HTTP/1.1
Host: myconsumer.com
Date: Fri, 4 Jul 2025 12:56:00 GMT
Content-type: application/json
Link: <https://mythingserver.com/things/mylamp1/properties/level>; rel="self"
86
Consumer が、有効な コールバック URL に対して上記の形式に従う HTTP リクエストを受信した場合、 Web Thing に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
200 OK に設定するHTTP/1.1 200 OK
すべての Properties の監視をキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
DELETE に設定するobserveallproperties
操作中の HTTP レスポンスの
Location ヘッダーで提供された subscription URL に設定する
DELETE /things/properties/a84fc5df-2667-4db2-a767-feb4640f2cf7 HTTP/1.1
Host: mythingserver.com
Web Thing が上記の形式に従う HTTP リクエストを受信し、 提供された URL を持つ properties 監視サブスクリプションが存在する場合、 監視サブスクリプションを正常にキャンセルしたならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
204 No
Content に設定するHTTP/1.1 204 No Content
Event を購読する際に使用する event リソースの URL は、 対応する EventAffordance 内で、次を満たす Form を特定することにより、Thing Description [wot-thing-description11] から取得しなければならない(MUST)。
op メンバーが値
subscribeevent を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
contentType メンバーが
application/json の値を持つこと
subprotocol メンバーが
webhook の値を持つこと
その後、
href メンバーの解決済み値を event
リソースの URL として使用しなければならない(MUST)。
POST /things/lamp/events/overheated HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
{
callbackURL: "https://myconsumer.com/listeners/e79dd0a5-4537-4ded-a10f-bb4eb2aca28d"
}
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が対応する Event を購読する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
201 Created に設定するLocation ヘッダーを、
個別の event サブスクリプションを表す一意の URL に設定する。
これは、後で
Consumer がサブスクリプションを
キャンセルする際に使用する。
HTTP/1.1 201 Created
Location: /things/events/overheated/ce527faa-a5ab-4f03-8f85-e4411d13edb5
event サブスクリプションが登録されている間、 監視対象の Event のインスタンスが発生するたびに、 Web Thing は、購読している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
POST に設定するContent-Type ヘッダーを
application/json に設定する(event に
データペイロードがある場合のみ)
rel を self に設定した Link ヘッダー
Date ヘッダー。
[rfc9110] の HTTP
Date 形式を使用する
event にデータペイロードが含まれない場合、リクエストの
Content-Type ヘッダーは
設定すべきではなく(SHOULD NOT)、本文は
空であるべきである。
null、空の引用符
("")、または空の波括弧 ({}) などの
有効な JSON 値は、有効なデータペイロードである可能性があり、
「空」の本文とはみなされない。
POST /listeners/e79dd0a5-4537-4ded-a10f-bb4eb2aca28d HTTP/1.1
Host: myconsumer.com
Date: Fri, 4 Jul 2025 16:46:00 GMT
Content-type: application/json
Link: <https://mythingserver.com/things/mylamp1/events/overheated>; rel="self"
90
Consumer が、有効な コールバック URL に対して上記の形式に従う HTTP リクエストを受信した場合、 Web Thing に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
200 OK に設定するHTTP/1.1 200 OK
Event へのサブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
DELETE に設定するsubscribeevent 操作中の
HTTP レスポンスの Location ヘッダーで提供された
subscription URL に設定する
DELETE /things/events/overheated/ce527faa-a5ab-4f03-8f85-e4411d13edb5 HTTP/1.1
Host: mythingserver.com
Web Thing が上記の形式に従う HTTP リクエストを受信し、 提供された URL を持つ event サブスクリプションが存在する場合、 サブスクリプションを正常にキャンセルしたならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
204 No
Content に設定するHTTP/1.1 204 No Content
Web Thing のすべての
Events を購読する際に使用する events リソースの URL は、
Thing
Description の最上位の
forms メンバー内で、次を満たす
Form
を特定することにより、
Thing
Description [wot-thing-description11]
から取得しなければならない(MUST)。
op メンバーが値
subscribeallevents を含むこと
href メンバーの値の URI
scheme [RFC3986]
が http または https であること
contentType メンバーが
application/json の値を持つこと
subprotocol メンバーが
webhook の値を持つこと
その後、href メンバーの解決済み値を
events リソースの URL として使用しなければならない(MUST)。
POST /things/lamp/events HTTP/1.1
Host: mythingserver.com
Content-Type: application/json
{
callbackURL: "https://myconsumer.com/listeners/bdd2aa13-387b-4c97-9725-52294a9fa5a9"
}
Web Thing が上記の形式に従う HTTP リクエストを受信し、 Consumer が Thing の Events を購読する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
201 Created に設定するLocation ヘッダーを、
個別の event サブスクリプションを表す一意の URL に設定する。
これは、後で
Consumer がサブスクリプションを
キャンセルする際に使用する。
HTTP/1.1 201 Created
Location: /things/events/929dbb69-eb66-46df-a0fe-93701d82e7ea
events サブスクリプションが登録されている間、 event が発生するたびに、Web Thing は、購読している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
POST に設定するContent-Type ヘッダーを
application/json に設定する(event が
データペイロードを含む場合のみ)
rel を self に設定した Link ヘッダー
Date ヘッダー。
[rfc9110] の HTTP
Date 形式を使用する
event にデータペイロードが含まれない場合、リクエストの
Content-type ヘッダーは
設定すべきではなく(SHOULD NOT)、本文は
空であるべきである。
null、空の引用符
("")、または空の波括弧 ({}) などの
有効な JSON 値は、有効なデータペイロードである可能性があり、
「空」の本文とはみなされない。
POST /listeners/bdd2aa13-387b-4c97-9725-52294a9fa5a9 HTTP/1.1
Host: myconsumer.com
Date: Fri, 4 Jul 2025 17:04:00 GMT
Content-type: application/json
Link: <https://mythingserver.com/things/mylamp1/events/overheated>; rel="self"
86
Consumer が、有効な コールバック URL に対して上記の形式に従う HTTP リクエストを受信した場合、 Web Thing に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
200 OK に設定するHTTP/1.1 200 OK
すべての Events へのサブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。
DELETE に設定するsubscribeallevents
操作中の HTTP レスポンスの
Location ヘッダーで提供された subscription URL に設定する
DELETE /things/events/929dbb69-eb66-46df-a0fe-93701d82e7ea HTTP/1.1
Host: mythingserver.com
Web Thing が上記の形式に従う HTTP リクエストを受信し、 提供された URL を持つ events サブスクリプションが存在する場合、 events サブスクリプションを正常にキャンセルしたならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。
204 No
Content に設定するHTTP/1.1 204 No Content
WoT Architecture [wot-architecture11] および WoT Thing Description [wot-thing-description11] 仕様のプライバシーに関する考慮事項を考慮に入れるべきである(SHOULD)。
実装上の助言については、WoT Security and Privacy Guidelines [wot-security] も参照すること。
WoT Architecture [wot-architecture11] および WoT Thing Description [wot-thing-description11] 仕様のセキュリティに関する考慮事項を考慮に入れるべきである(SHOULD)。
実装上の助言については、WoT Security and Privacy Guidelines [wot-security] も参照すること。
Thing Description のすべての
レベルにおける title および description メンバーの値は、ユーザー
インターフェイスを生成するために使用されることがあるため、必要に応じて
支援技術によってもレンダリングできる、人間が読める文字列であるべきである(SHOULD)。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: