Web of Things (WoT) プロファイル

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-wot-profile-20251104/
最新公開バージョン:
https://www.w3.org/TR/wot-profile/
最新編集者草案:
https://w3c.github.io/wot-profile/
履歴:
https://www.w3.org/standards/history/wot-profile/
コミット 履歴
編集者:
Michael Lagally (Oracle Corp.)
Ben Francis (招待専門家)
Sebastian Kaebisch (Siemens AG)
Tomoaki Mizushima (Internet Research Institute, Inc.)
以前の編集者:
Michael McCool (Intel Corp. 在籍時)
Ryuichi Matsukura (Fujitsu Ltd. 在籍時)
フィードバック:
GitHub w3c/wot-profile (プル リクエスト, 新規 issue, 未解決の issue)
public-wot-wg@w3.org 件名行を [wot-profile] … メッセージのトピック … とする (アーカイブ)
貢献者
GitHub リポジトリ内

概要

本仕様は、プロファイリング機構および一連の プロファイルを定義する。これらは、そのまま使える 相互運用性を、Web Things と、そのConsumersとの間で、Web of Things 上において可能にする。

そのまま使える相互運用性があるとは、ある Profileに 適合する任意のConsumerが、 同じProfileに適合する任意のThingと、追加の カスタマイズなしに相互作用できることを意味する。

Profile は、適合するConsumersおよびThingsが従わなければならない一連の アサーションを提供する技術仕様である。

プロファイリング機構は、ある Thing が 1 つ以上の Profilesに適合していることを示す手段を提供する。これは、その Profilesの識別子を、その Thing Descriptionprofile メンバーで参照することによって行う。

本仕様は 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 によって管理される。

1. はじめに

1.1 動機

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を定義することがある。

1.2 ユースケースと要件

Web of Things Interest Group は、さまざまな 異なる産業を代表する利害関係者から Web of Things の ユースケースを収集した。これには、垂直方向の ドメイン固有のユースケースと、複数の応用分野に 適用される水平方向のユースケースの両方が含まれる [wot-usecases]。

いくつかのドメイン固有の ユースケースは、複数ベンダーのデバイスを容易に統合する必要性に言及している。 これは、「マルチベンダーシステム統合」および「そのまま使える相互運用性」を 必要とするクロスドメイン ユースケースにとって特に重要である。

Profiles の 要件の集合は、これらのユースケースから導出された。

1.3 そのまま使える 相互運用性

大まかに言えば、そのまま使える相互運用性とは、 Consumer が、Thing 固有のカスタマイズなしに、 Thing のすべての能力を使用できることが保証されている、ということである。

本仕様で使用される、そのまま使える相互運用性の完全な定義には、 複数の層が含まれる。以下の分類は、「H2020 - CREATE-IoT Project - Recommendations for commonalities and interoperability profiles of IoT platforms」 [H2020-CREATE-IoT] 報告書の用語を採用している。以下の定義は、WoT profile の範囲を反映するように 調整されている。

1.3.1 技術的 相互運用性

技術的相互運用性は通常、 通信プロトコルと、それらのプロトコルを動作させるために必要な インフラストラクチャに関連付けられる。これは、共通のプロトコル(例: HTTP / TCP/IP) について合意し、必要に応じて追加の明確化を提供することを 意味する。

1.3.2 構文的 相互運用性

構文的相互運用性は通常、 データ形式およびエンコーディング、ならびにそれらを圧縮するための 技術に関連付けられる。WoT におけるこれらの形式および エンコーディングの例には、JSON、XML、JSON-LD、UTF-8 ペイロードがある。

1.3.3 意味的 相互運用性

意味的相互運用性は、通信 パートナーの振る舞いに関する共通理解に関連する。 プロファイルの文脈では、(同期および非同期の)アクション セマンティクスの共通解釈、共通のイベントモデル、複数の プロパティを設定/取得する方法、書き込み可能なプロパティ、共通のエラーモデルおよび エラーメッセージが含まれる。

自動車および医療機器の意味的相互運用性など、ドメイン固有の オントロジーは、本仕様の範囲を超える。

1.3.4 組織的 相互運用性

プロファイルの文脈における組織的相互運用性は、 ある profile に適合する任意のConsumerが、 同じProfileに適合する任意の Thing と、 追加のカスタマイズなしに相互作用できることを意味する。

組織的相互運用性には、セキュリティ、信頼、プライバシーについて 共通に合意されたアプローチも必要である。すなわち、 Consumer には、 これらの共通の条件が適用される場合に限り、Things への アクセスが提供される。

プロファイル仕様の要件を満たす、さまざまなエンジニア、ベンダー、SDO によって作成された デバイスは、追加のカスタマイズなしに、適合する Consumers と統合できる。これは、インフラストラクチャ、地域、 文化をまたいで機能する。

2. 適合性

非規範的と明示された節に加えて、本仕様におけるすべての作成 ガイドライン、図、例、および注記は非規範的である。本仕様のそれ以外のすべては 規範的である。

本書におけるキーワード MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, SHOULD, および SHOULD NOT は、ここに示すように すべて大文字で現れる場合に限り、BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈される。

Thing または Consumer の実装は、本文書中の規範的文に従う場合、 本仕様に適合する。

3. 用語

Web Thing (Thing)、 ConsumerThing DescriptionPropertyActionEvent、および Protocol Binding などの基本的な WoT 用語は、WoT Architecture 仕様 [wot-architecture11] の Section 3 で定義されている。

3.1 追加定義

Profile
技術仕様であり、ある一連のアサーションを提供する。そのアサーションに適合する任意の Consumer は、そのアサーションにも適合する任意の Thingそのまま使える 相互運用性を持つ。

4. プロファイリング機構

Profile に適合するためには、Web Thing は、その Profile の仕様におけるすべての規範的文に 適合しなければならない(MUST)。

ある Web Thing が 1 つ以上のProfilesに適合することを示すために、 そのThing Description profile メンバーを含まなければならない(MUST) [wot-thing-description11]。 profile メンバーの 値は、単一のProfileを識別する有効な URI [RFC3986] 、または複数のProfilesを識別する有効な URI の配列の いずれかに設定されなければならない(MUST)。

Thing Descriptionprofile メンバーを使用するためには、 @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 が特定の操作に対して規定どおりに応答しない場合でも、 正常に回復できるべきである。

5. 共通制約

以下の節は、本文書によって定義される profiles に適用される。

5.1 単位

Thing Descriptions の作成者は、 自分たちの地理的地域で一般的な単位が世界的に適用可能ではなく、 重大な結果を伴う誤解を招く可能性があることを認識すべきである。

値が物理量を持つ場合、 unit を提供することが強くRECOMMENDEDされる。

世界規模の 配備で使用されるデバイスには、メートル法(SI 単位)を使用することが強くRECOMMENDEDされる。

5.2 日付 形式

別途規定されない限り、 すべての日付および時刻値は、[RFC3339] で定義される date-time 形式を使用しなければならない(MUST)。

2022-09-21T23:20:50.52Z
注記

曖昧さを減らすため、RFC 3339 では 時の値として 00 から 23 まで(24 ではない)のみを許可し、 タイムゾーンは UTC に対する数値オフセットとして表すことのみを許可している。 時刻に接尾辞 "Z" が適用される場合、それは UTC オフセット 00:00 を示す。

5.3 セキュリティ

適合するWeb Things は、以下のセキュリティスキーム [wot-thing-description11] のうち、少なくとも 1 つを使用しなければならない(MUST)。

  • NoSecurityScheme
  • BasicSecurityScheme
  • OAuth2SecurityScheme with the code or client flow

適合するConsumers は、以下のすべてのセキュリティ スキーム [wot-thing-description11] をサポートしなければならない(MUST)。

  • NoSecurityScheme
  • BasicSecurityScheme
  • OAuth2SecurityScheme 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)。

5.4 発見

Web ThingThing Description [wot-thing-description11] は、Direct Introduction Mechanism [wot-discovery] によって提供される HTTP URL [RFC9110] を使用して、 Thing Description Server [wot-architecture11] から取得可能でなければならない(MUST)。

5.6 エラー

HTTP profiles のプロトコルバインディングで 定義されるいずれかの操作が成功しない場合、 Web Thing は、失敗の理由を記述する HTTP エラー コードを含む HTTP レスポンスを送信しなければならない(MUST)。

エラーレスポンスには、以下の HTTP エラーコードのいずれかを使用することが RECOMMENDED される。

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error
  • 503 Service Unavailable

Web 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)。

6. HTTP Basic Profile

이 절은 HTTP Basic Profile을 정의하며, 여기에는 속성을 읽고 쓰며, 액션을 호출, 질의 및 취소하기 위한 Protocol Binding이 포함됩니다.

이 profile은 속성을 관찰하고 이벤트를 수신하기 위한 작업을 제공하기 위해 HTTP SSE Profile 또는 HTTP Webhook Profile과 함께 사용할 수 있습니다.

HTTP Basic Profile을 준수하려면 Web Things와 ConsumerCommon Constraints 절의 모든 단언도 준수해야 MUST 합니다.

6.1 식별자

주어진 Web Thing이 HTTP Basic Profile을 준수함을 표시하려면, 그 Thing Descriptionhttps://www.w3.org/2022/wot/profile/http-basic/v1 값을 갖는 profile 멤버 [wot-thing-description11]를 가져야 MUST 합니다.

6.2 프로토콜 바인딩

이 절은 Consumer가 HTTP 프로토콜 [RFC9112]을 통해 JSON [JSON] 페이로드를 사용하여 Web Thing [wot-architecture11]과 통신하는 방식을 설명하는 Protocol Binding을 정의합니다.

HTTP Basic Profile을 준수하는 Consumer 또는 Web Thing은 이 프로토콜 바인딩을 구현해야 MUST 합니다.

이 절 전체에서 제공되는 예제는 다음 Thing Description을 생성하는 Web ThingConsumer가 어떻게 통신하는지를 설명합니다:

{
  "@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"
    }
  ]
}

6.2.1 속성

6.2.1.1 readproperty

Property 값을 읽을 때 사용할 property 리소스의 URL은 Thing Description에서 해당 PropertyAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • 기본값이 적용된 후, 그 op 멤버가 readproperty 값을 포함합니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 property 리소스의 URL로 사용되어야 MUST 합니다.

Property 값을 읽으려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 GET으로 설정
  • URL은 property 리소스의 URL로 설정
  • 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으로 설정
  • JSON으로 직렬화된 property 값을 포함하는 본문
HTTP/1.1 200 OK
Content-Type: application/json
false
6.2.1.2 writeproperty

Property 값을 쓸 때 사용할 property 리소스의 URL은 Thing Description에서 해당 PropertyAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • 기본값이 적용된 후, 그 op 멤버가 writeproperty 값을 포함합니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 property 리소스의 URL로 사용되어야 MUST 합니다.

Property 값을 쓰려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 PUT으로 설정
  • URL은 property 리소스의 URL로 설정
  • Content-Type 헤더는 application/json으로 설정
  • JSON으로 직렬화된 property의 요청된 새 값을 포함하는 본문
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
6.2.1.3 readallproperties

모든 Properties 값을 한 번에 읽을 때 사용할 properties 리소스의 URL은 Thing Description에서 최상위 forms 멤버 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • op 멤버가 readallproperties 값을 포함합니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 properties 리소스의 URL로 사용되어야 MUST 합니다.

모든 Properties 값을 읽으려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 GET으로 설정
  • URL은 properties 리소스의 URL로 설정
  • 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으로 설정
  • 모든 읽기 가능한 properties의 값을 property 이름을 키로 하는 객체로 JSON 직렬화한 본문
HTTP/1.1 200 OK
Content-Type: application/json
{
  "on": false,
  "level": 100
}
6.2.1.4 writemultipleproperties

여러 Properties 값을 한 번에 쓸 때 사용할 properties 리소스의 URL은 Thing Description에서 최상위 forms 멤버 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • op 멤버가 writemultipleproperties 값을 포함합니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 properties 리소스의 URL로 사용되어야 MUST 합니다.

여러 properties 값을 한 번에 쓰려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 PUT으로 설정
  • URL은 Properties 리소스의 URL로 설정
  • Content-Type 헤더는 application/json으로 설정
  • 쓰기 가능한 Properties의 요청된 새 값을 property 이름을 키로 하는 객체로 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 작업은 요청 페이로드 형식의 복잡성 때문에, 그리고 readpropertyreadallproperties에 비해 많은 기능을 추가하지 않기 때문에 제외됩니다. writeallpropertieswritemultipleproperties의 특수한 경우일 뿐이므로 제외됩니다.

6.2.2 액션

6.2.2.1 invokeaction

Action을 호출할 때 사용할 action 리소스의 URL은 Thing Description에서 해당 ActionAffordance 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • 기본값이 적용된 후, 그 op 멤버의 값이 invokeaction입니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 action 리소스의 URL로 사용되어야 MUST 합니다.

Web Thing에서 Action을 호출하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 POST로 설정
  • URL은 action 리소스의 URL로 설정
  • Accept 헤더는 application/json으로 설정
  • Content-Type 헤더는 application/json으로 설정(action에 입력이 있는 경우에만)
  • 있는 경우 action에 대한 입력을 JSON으로 직렬화한 본문
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 합니다:

  1. 동기식 액션 응답
  2. 비동기식 액션 응답
  3. 오류 응답

ActionAffordancesynchronous 멤버는 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 Thinginvokeaction 요청에 응답하기 전에 action 실행을 시도하는 중 오류를 만나면, 오류 응답을 보내야 MUST 합니다.

적합한 Consumers는 초기 invokeaction 요청에 대한 세 가지 응답 유형을 모두 지원해야 MUST 합니다. 초기 요청 이후, ActionStatus 리소스에 대한 후속 작업 지원은 OPTIONAL입니다.

6.2.2.1.1 ActionStatus 객체

비동기식 action 호출 요청의 상태는 다음 멤버를 포함하는 ActionStatus 객체로 표현됩니다:

멤버 설명 할당 유형
status action 요청의 상태입니다. 필수 string ( pending, running, completed 또는 failed 중 하나)
output 완료된 action의 출력 데이터(있는 경우)로, 해당 ActionAffordanceoutput 데이터 스키마를 준수해야 MUST 합니다. 선택 사항 임의 유형
error 실패한 action과 관련된 오류 메시지(있는 경우)로, Problem Details 형식 [RFC7807]의 JSON 직렬화를 사용해야 MUST 합니다( queryaction 작업에 대한 응답에서만 필요). 선택 사항 object
href queryactioncancelaction 작업에서 사용할 수 있는 ActionStatus 리소스의 [URL]로, 그 URI scheme [RFC3986]은 http 또는 https로 확인되어야 MUST 합니다( 비동기식 액션 응답에만 필요). 선택 사항 string
timeRequested Thing이 action 실행 요청을 수신한 시간을 나타내는 타임스탬프입니다. (날짜 형식 제약은 날짜 형식을 참조하십시오). 선택 사항 string
timeEnded Thing이 action 실행을 성공적으로 완료했거나, action 실행에 실패한 시간을 나타내는 타임스탬프입니다. (날짜 형식 제약은 날짜 형식을 참조하십시오). 선택 사항 string
참고

Thing의 시계가 올바른 시간으로 설정되어 있지 않을 수 있습니다. 시간이 중요하다면 Consumer는 따라서 ActionStatus 객체의 timeEnded 멤버를 timeRequested 멤버에 상대적인 것으로 처리하도록 선택할 수 있지만, 반드시 자신의 내부 시계나 다른 Things의 시계에 상대적인 것으로 처리할 필요는 없습니다.

6.2.2.1.2 동기식 액션 응답

출력이 있는 action에 대해 동기식 액션 응답을 제공하는 경우, Web Thing은 다음과 같은 HTTP 응답을 보내야 MUST 합니다:

  • 상태 코드는 200으로 설정
  • Content-Type 헤더는 application/json으로 설정
  • action의 출력을 JSON으로 직렬화하여 포함하는 본문
예제 14: 출력이 있는 동기식 action 응답
HTTP/1.1 200 OK
Content-Type: application/json
20

출력이 없는 action에 대해 동기식 액션 응답을 제공하는 경우, Web Thing은 다음과 같은 HTTP 응답을 보내야 MUST 합니다:

  • 상태 코드는 204로 설정
  • Content-Type 헤더는 설정하지 않음
  • 빈 본문
예제 15: 출력이 없는 동기식 action 응답
HTTP/1.1 204 No Content
참고

null, 빈 따옴표 ("") 또는 빈 중괄호({})와 같은 유효한 JSON 값은 유효한 action 출력일 수 있으며, "빈" 본문으로 간주되지 않습니다.

6.2.2.1.3 비동기식 액션 응답

비동기식 액션 응답을 제공하는 경우, Web ThingActionStatus 리소스의 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 있습니다.

예를 들어 Thing이 과부하 상태이기 때문에 action을 사용할 수 없어 호출을 수락할 수 없는 경우, Web Thing503 오류 응답을 반환해야 SHOULD 합니다.

6.2.2.2 queryaction

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으로 설정
  • URL은 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으로 설정
  • action 요청의 현재 상태를 나타내는 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"
}
6.2.2.3 cancelaction

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로 설정
  • URL은 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
6.2.2.4 queryallactions

진행 중인 모든 action 요청의 상태를 질의할 때 사용할 actions 리소스의 URL은 Thing Description에서 최상위 forms 멤버 내부의 다음 조건을 만족하는 Form을 찾아 얻어야 MUST 합니다:

  • op 멤버가 queryallactions 값을 포함합니다
  • 해당되는 경우 base URL을 기준으로 확인된 후, 그 href 멤버 값의 URI scheme [RFC3986]이 http 또는 https입니다
  • 기본값이 적용된 후, 그 contentType 멤버의 값이 application/json입니다

그런 다음 href 멤버의 확인된 값은 actions 리소스의 URL로 사용되어야 MUST 합니다.

진행 중인 모든 action 요청의 상태를 질의하려면, Consumer는 다음과 같은 HTTP 요청을 Web Thing에 보내야 MUST 합니다:

  • 메서드는 GET으로 설정
  • URL은 actions 리소스의 URL로 설정
  • 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으로 설정
  • Action 이름을 키로 하는 객체를 포함하는 본문으로, 각 객체 멤버의 값은 action 요청을 나타내는 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"
    }
  ]
}
참고: ActionStatus 객체의 보존
action 요청이 cancelaction 작업으로 취소되면, 그 ActionStatus 객체는 삭제되며 보존할 필요가 없습니다. 그 밖의 모든 action 요청에 대해서는 Web Thing이 나중에 queryaction 또는 queryallactions 작업으로 그 상태를 질의할 수 있도록 ActionStatus 객체를 저장한다고 가정합니다. ActionStatus 객체를 무기한 보존할 것으로 기대되지는 않으며, 휘발성 메모리에 저장되거나 주기적으로 정리될 수 있습니다. ActionStatus 객체를 보존할 시간의 길이는 구현별로 달라질 것으로 예상되며, 애플리케이션별 요구사항이나 리소스 제약에 따라 달라질 수 있습니다.

7. HTTP SSE Profile

この節は HTTP SSE Profile を定義する。これには、Server-Sent Events [EVENTSOURCE] を使用して、 Properties を監視し、 Events を待ち受けるための Protocol Binding が含まれる。

この profile は、プロパティを読み書きし、アクションを呼び出し、 問い合わせ、キャンセルするための操作を提供するために、 HTTP Basic Profile と併用してもよい。

HTTP SSE Profile に 適合するためには、Web Things および Consumers は、 共通制約 節にあるすべてのアサーションにも適合しなければならない(MUST)。

7.1 識別子

ある Web Thing が HTTP SSE Profile に適合することを示すためには、その Thing Description は、値 https://www.w3.org/2022/wot/profile/http-sse/v1 を持つ profile メンバー [wot-thing-description11] を持たなければならない(MUST)。

7.2 プロトコルバインディング

この節は、Server-Sent Events [EVENTSOURCE] を使用して、 ConsumerWeb 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"
    }
  ]
}

7.2.1 プロパティ

7.2.1.1 observeproperty

property の値を監視する際に使用する Property リソースの URL は、 対応する PropertyAffordance 内で、次を満たす Form を特定することにより、Thing Description から取得しなければならない(MUST)。

  • その op メンバーが値 observeproperty を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その 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)。

これには、ConsumerWeb Thing に対して、次を含む HTTP リクエストを送信することが含まれる。

  • メソッドを GET に設定する
  • URL を property リソースの URL に設定する
  • 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 を使用した 接続の開始

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 ThingConsumer とのオープン接続を持つ間に、 指定された Property の値が変更されるたびに、 Web Thing は Server-Sent Events [EVENTSOURCE] 仕様のイベントストリーム形式を使用して、property 値を Consumer に送信しなければならない(MUST)。 送信される 各メッセージについて、Web Thingevent フィールドを 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

ConsumerWeb Thing の間の接続が切断された場合(下で定義される unobserve 操作の結果である場合を除く)、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] に概説された手順に従って、 接続を再確立しなければならない(MUST)。 接続が再確立されたら、 Web Thing は可能であれば、 Last-Event-ID ヘッダーで Consumer により指定された最後の変更以降に発生した、 取りこぼされた property 変更を送信すべきである(SHOULD)。

注記: text/event-stream にラップされた application/json

Property 値は JSON でシリアライズされ、 text/event-stream 形式でシリアライズされた Server-Sent Event の data フィールドで提供される。 HTTP ヘッダーで使用される text/event-stream コンテンツタイプは sse サブプロトコルによって暗黙的に示されるものと想定され、 埋め込まれた application/json コンテンツタイプは Form の contentType メンバー(デフォルト適用後)で示される。

7.2.1.2 unobserveproperty

Property の監視を停止するために、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] で指定されるとおり、 対応する Web Thing との Server-Sent Events 接続を終了しなければならない(MUST)。

注記: JavaScript を使用した接続の終了

JavaScript [ECMASCRIPT] で実装され、 EventSource インターフェイスを公開するランタイムで実行される Consumers の場合、Server-Sent Events 接続は EventSource [EVENTSOURCE] オブジェクト上の close() メソッドを使用して終了できる。

levelSource.close();
7.2.1.3 observeallproperties

Web Thing のすべての properties への変更を監視する際に使用する properties リソースの URL は、 Thing Description の最上位の forms メンバー内で、次を満たす Form を特定することにより、 Thing Description から取得しなければならない(MUST)。

  • その op メンバーが値 observeallproperties を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その 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)。

これには、ConsumerWeb Thing に対して、次を含む HTTP リクエストを送信することが含まれる。

  • メソッドを GET に設定する
  • URL を properties リソースの URL に設定する
  • 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 を使用した 接続の開始

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 Thingevent フィールドを 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

ConsumerWeb Thing の間の接続が切断された場合(下で定義される unobserveallproperties 操作の結果である場合を除く)、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] に概説された手順に従って、 接続を再確立しなければならない(MUST)。 接続が再確立されたら、 Web Thing は可能であれば、 Last-Event-ID ヘッダーで Consumer により指定された最後の変更以降に発生した、 取りこぼされた property 変更を送信すべきである(SHOULD)。

注記: text/event-stream にラップされた application/json

Property 値は JSON でシリアライズされ、 text/event-stream 形式でシリアライズされた Server-Sent Event の data フィールドで提供される。 HTTP ヘッダーで使用される text/event-stream コンテンツタイプは sse サブプロトコルによって暗黙的に示されるものと想定され、 埋め込まれた application/json コンテンツタイプは Form の contentType メンバー(デフォルト適用後)で示される。

7.2.1.4 unobserveallproperties

すべての properties の監視を解除するために、 Consumer は、 Server-Sent Events 仕様 [EVENTSOURCE] で指定された手順に従い、 Web Thing の properties エンドポイントとの対応する Server-Sent Events 接続を終了しなければならない(MUST)。

注記: JavaScript を使用した接続の終了

JavaScript [ECMASCRIPT] で実装され、 EventSource インターフェイスを公開するランタイムで実行される Consumers の場合、Server-Sent Events 接続は EventSource [EVENTSOURCE] オブジェクト上の close() メソッドを使用して終了できる。

lampPropertiesSource.close();

7.2.2 イベント

HTTP SSE Profile は、 ConsumersWeb Thing により発行されるイベントを購読するための機構として、 Server-Sent Events [EVENTSOURCE] を使用する。

注記

Consumers は、この profile に適合するために、 Server-Sent Events 仕様の EventSource JavaScript API を実装する必要はない。 任意のプログラミング言語を使用して event stream を消費してよい。

7.2.2.1 subscribeevent

Event を購読する際に使用する event リソースの URL は、 対応する EventAffordance 内で、次を満たす Form を特定することにより、 Thing Description から取得しなければならない(MUST)。

  • デフォルトが適用された後、その op メンバーが値 subscribeevent を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その 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)。

これには、ConsumerWeb Thing に対して、次を含む HTTP リクエストを送信することが含まれる。

  • メソッドを GET に設定する
  • URL を event リソースの URL に設定する
  • 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 を使用した 接続の開始

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 ThingConsumer とのオープン 接続を持つ間に、指定された型の event が発生するたびに、 Web Thing は Server-Sent Events [EVENTSOURCE] 仕様のイベントストリーム形式を使用して、event データを Consumer に送信しなければならない(MUST)。 送信される 各メッセージについて、Web Thingevent フィールドを 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

ConsumerWeb Thing の間の接続が切断された場合(下で定義される unsubscribeevent 操作の結果である場合を除く)、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] に概説された手順に従って、 接続を再確立しなければならない(MUST)。 接続が再確立されたら、 Web Thing は可能であれば、 Last-Event-ID ヘッダーで Consumer により指定された最後の event 以降に発生した、 取りこぼされた events を送信すべきである(SHOULD)。

注記: text/event-stream にラップされた application/json

Event ペイロードは JSON でシリアライズされ、 text/event-stream 形式でシリアライズされた Server-Sent Event の data フィールドで提供される。 HTTP ヘッダーで使用される text/event-stream コンテンツタイプは sse サブプロトコルによって暗黙的に示されるものと想定され、 埋め込まれた application/json コンテンツタイプは Form の contentType メンバー(デフォルト適用後)で示される。

7.2.2.2 unsubscribeevent

Event の購読を解除するために、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] で指定されるとおり、 対応する Web Thing との Server-Sent Events 接続を終了しなければならない(MUST)。

注記: JavaScript を使用した接続の終了

JavaScript [ECMASCRIPT] で実装され、 EventSource インターフェイスを公開するランタイムで実行される Consumers の場合、Server-Sent Events 接続は EventSource [EVENTSOURCE] オブジェクト上の close() メソッドを使用して終了できる。

overheatedEventSource.close();
7.2.2.3 subscribeallevents

Web Thing により発行されるすべての Events を購読する際に使用する events リソースの URL は、 Thing Description の最上位の forms メンバー内で、次を満たす Form を特定することにより、 Thing Description から取得しなければならない(MUST)。

  • その op メンバーが値 subscribeallevents を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その 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)。

これには、ConsumerWeb Thing に対して、次を含む HTTP リクエストを送信することが含まれる。

  • メソッドを GET に設定する
  • URL を events リソースの URL に設定する
  • 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 を使用した 接続の開始

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 ThingConsumer とのオープン 接続を持つ間に event が発生するたびに、 Web Thing は Server-Sent Events [EVENTSOURCE] 仕様のイベントストリーム形式を使用して、event データを Consumer に送信しなければならない(MUST)。 送信される各メッセージについて、Web Thingevent フィールドを 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

ConsumerWeb Thing の間の接続が切断された場合(下で定義される unsubscribeallevents 操作の結果である場合を除く)、 Consumer は、Server-Sent Events 仕様 [EVENTSOURCE] に概説された手順に従って、 接続を再確立しなければならない(MUST)。 接続が再確立されたら、 Web Thing は可能であれば、 Last-Event-ID ヘッダーで Consumer により指定された最後の event 以降に発生した、 取りこぼされた events を送信すべきである(SHOULD)。

注記: text/event-stream にラップされた application/json

Event ペイロードは JSON でシリアライズされ、 text/event-stream 形式でシリアライズされた Server-Sent Event の data フィールドで提供される。 HTTP ヘッダーで使用される text/event-stream コンテンツタイプは sse サブプロトコルによって暗黙的に示されるものと想定され、 埋め込まれた application/json コンテンツタイプは Form の contentType メンバー(デフォルト適用後)で示される。

7.2.2.4 unsubscribeallevents

すべての Events の購読を解除するために、 Consumer は、 Server-Sent Events 仕様 [EVENTSOURCE] で指定された手順に従い、 Web Thing の events エンドポイントとの対応する Server-Sent Events 接続を終了しなければならない(MUST)。

注記: JavaScript を使用した接続の終了

JavaScript [ECMASCRIPT] で実装され、 EventSource インターフェイスを公開するランタイムで実行される Consumers の場合、Server-Sent Events 接続は EventSource [EVENTSOURCE] オブジェクト上の close() メソッドを使用して終了できる。

lampEventsSource.close();

8. HTTP Webhook Profile

この節は HTTP Webhook Profile を定義する。これには、 Protocol Binding が含まれ、Properties を監視し、 EventsWebhooks を使用して待ち受ける。

HTTP Webhook profile は、プロパティを読み書きし、 アクションを呼び出し、問い合わせ、キャンセルするための操作を提供するために、 HTTP Basic Profile と併用してもよい(MAY)。

HTTP Webhook profile は、HTTP SSE Profile の代替イベント機構として 使用してもよい(MAY)。

HTTP Webhook Profile に 適合するためには、Web Things および Consumers は、 共通制約 節にあるすべてのアサーションにも適合しなければならない(MUST)。

注記: HTTP クライアント およびサーバーの役割

HTTP Webhook profile を実装するためには、 ThingConsumer の両方が、 HTTP クライアントおよび HTTP サーバーの両方として動作でき、ネットワーク越しに互いに アクセス可能でなければならない。これは、すべての配備 シナリオで可能とは限らない。

8.1 識別子

ある Web Thing が HTTP Webhook Profile に適合することを示すためには、その Thing Description は、値 https://www.w3.org/2022/wot/profile/http-webhook/v1 を持つ profile メンバー [wot-thing-description11] を持たなければならない(MUST)。

注記

profile メンバーは配列であり、複数の profile エントリーを 含むことができる点に注意すること。これは、Web Thing が、その配列内のすべての Profiles に適合することを示す。

8.2 プロトコルバインディング

この節は、ConsumerWeb Thing が Webhooks を使用して どのように通信するかを記述する Protocol Binding を定義する。

HTTP Webhook Profile に適合する Consumer または Web Thing は、 このプロトコルバインディングを実装しなければならない(MUST)。

この節全体で提供される例は、 Consumer が、次の Thing Description [wot-thing-description11] を生成する Web Thing とどのように通信するかを記述している。

45: HTTP Webhook Profile の Thing Description 例
{
  "@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"
    }
  ]
}

8.2.1 プロパティ

8.2.1.1 observeproperty

Property の値を監視する際に使用する property リソースの URL は、 対応する PropertyAffordance 内で、次を満たす Form を特定することにより、Thing Description [wot-thing-description11] から取得しなければならない(MUST)。

  • その op メンバーが値 observeproperty を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その href メンバーの値の URI scheme [RFC3986] が http または https であること
  • デフォルトが適用された後、その contentType メンバーが application/json の値を持つこと
  • その subprotocol メンバーが webhook の値を持つこと

その後、href メンバーの解決済み値を property リソースの URL として使用しなければならない(MUST)。

Property を監視するために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を property リソースの URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 次のメンバーを持つ JSON オブジェクトを含む本文:
    • callbackURL メンバーを、 Thing が property 変更通知を Consumer に送信するために使用すべき コールバック URL に設定する。
46: property 監視リクエスト
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)。

  • ステータスコードを 201 Created に設定する
  • Location ヘッダーを、 個別の property 監視サブスクリプションを表す一意の URL に設定する。 これは、後で ConsumerProperty の監視をキャンセルする際に使用する。
47: property 監視レスポンス
HTTP/1.1 201 Created
Location: /things/properties/level/74353483-3997-437a-a4f5-84d03784e517

property 監視サブスクリプションが登録されている間、 監視対象の Property の値に変更が発生するたびに、 Web Thing は、監視している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を、監視を登録する際に Consumer が提供した コールバック URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 対応する property リソースの URL を URL として設定し、 relself に設定した Link ヘッダー
  • ユーザーエージェントにより property 変更の時刻に自動的に設定される Date ヘッダー。 [rfc9110] の HTTP Date 形式を使用する
  • 新しい Property の値を含む本文。 JSON でシリアライズされ、 Property Affordance のデータスキーマに適合する
48: property 変更通知リクエスト
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 に設定する
49: property 変更通知レスポンス
HTTP/1.1 200 OK
8.2.1.2 unobserveproperty

property の監視サブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを DELETE に設定する
  • URL を、 observeproperty 操作中の HTTP レスポンスの Location ヘッダーで提供された subscription URL に設定する
50: property 監視解除リクエスト
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 に設定する
51: property 監視解除レスポンス
HTTP/1.1 204 No Content
8.2.1.3 observeallproperties

Web Thing のすべての Properties の値を監視する際に使用する properties リソースの URL は、 Thing Description の最上位の forms メンバー内で、次を満たす Form を特定することにより、 Thing Description [wot-thing-description11] から取得しなければならない(MUST)。

  • その op メンバーが値 observeallproperties を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その href メンバーの値の URI scheme [RFC3986] が http または https であること
  • デフォルトが適用された後、その contentType メンバーが application/json の値を持つこと
  • その subprotocol メンバーが webhook の値を持つこと

その後、href メンバーの解決済み値を properties リソースの URL として使用しなければならない(MUST)。

Web Thing のすべての Properties への変更を監視するために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を properties リソースの URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 次のメンバーを持つ JSON オブジェクトを含む本文:
    • callbackURL メンバーを、 Thing が property 変更通知を Consumer に送信するために使用すべき コールバック URL に設定する。
52: すべての properties の監視リクエスト
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 リクエストを受信し、 ConsumerThingProperties を監視する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。

  • ステータスコードを 201 Created に設定する
  • Location ヘッダーを、 個別の監視サブスクリプションを表す一意の URL に設定する。 これは、後で Consumer が すべての Properties の監視をキャンセルする際に使用する。
53: すべての properties の監視レスポンス
HTTP/1.1 201 Created
Location: /things/properties/a84fc5df-2667-4db2-a767-feb4640f2cf7

properties 監視サブスクリプションが登録されている間、 監視可能な任意の Property の値に変更が発生するたびに、 Web Thing は、監視している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を、監視サブスクリプションを登録する際に Consumer が提供した コールバック URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 対応する PropertyAffordance の URL を URL として設定し、 relself に設定した Link ヘッダー
  • ユーザーエージェントにより property 変更の時刻に自動的に設定される Date ヘッダー。 [rfc9110] の HTTP Date 形式を使用する
  • 新しい Property の値を含む本文。 JSON でシリアライズされ、 PropertyAffordance のデータスキーマに適合する
54: property 変更通知リクエスト
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 に設定する
55: property 変更通知レスポンス
HTTP/1.1 200 OK
8.2.1.4 unobserveallproperties

すべての Properties の監視をキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを DELETE に設定する
  • URL を、 observeallproperties 操作中の HTTP レスポンスの Location ヘッダーで提供された subscription URL に設定する
56: すべての properties の監視解除リクエスト
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 に設定する
57: すべての properties の監視解除レスポンス
HTTP/1.1 204 No Content

8.2.2 イベント

8.2.2.1 subscribeevent

Event を購読する際に使用する event リソースの URL は、 対応する EventAffordance 内で、次を満たす Form を特定することにより、Thing Description [wot-thing-description11] から取得しなければならない(MUST)。

  • その op メンバーが値 subscribeevent を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その href メンバーの値の URI scheme [RFC3986] が http または https であること
  • デフォルトが適用された後、その contentType メンバーが application/json の値を持つこと
  • その subprotocol メンバーが webhook の値を持つこと

その後、 href メンバーの解決済み値を event リソースの URL として使用しなければならない(MUST)。

Event を購読するために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を event リソースの URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 次のメンバーを持つ JSON オブジェクトを含む本文:
    • callbackURL メンバーを、 Thing が event 通知を Consumer に送信するために使用すべき コールバック URL に設定する。
58: event 購読リクエスト
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 がサブスクリプションを キャンセルする際に使用する。
59: event 購読レスポンス
HTTP/1.1 201 Created
Location: /things/events/overheated/ce527faa-a5ab-4f03-8f85-e4411d13edb5

event サブスクリプションが登録されている間、 監視対象の Event のインスタンスが発生するたびに、 Web Thing は、購読している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を、 ConsumerEvent を購読する際に提供した コールバック URL に設定する
  • Content-Type ヘッダーを application/json に設定する(event に データペイロードがある場合のみ)
  • 対応する event リソースの URL を URL として設定し、 relself に設定した Link ヘッダー
  • ユーザーエージェントにより event が発生した時刻に自動的に設定される Date ヘッダー。 [rfc9110] の HTTP Date 形式を使用する
  • event のデータペイロード(存在する場合)を含む本文。 JSON でシリアライズされ、 EventAffordance のデータスキーマに適合する

event にデータペイロードが含まれない場合、リクエストの Content-Type ヘッダーは 設定すべきではなく(SHOULD NOT)、本文は 空であるべきである。

注記

null、空の引用符 ("")、または空の波括弧 ({}) などの 有効な JSON 値は、有効なデータペイロードである可能性があり、 「空」の本文とはみなされない。

60: event 通知リクエスト
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 に設定する
61: event 通知レスポンス
HTTP/1.1 200 OK
8.2.2.2 unsubscribeevent

Event へのサブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを DELETE に設定する
  • URL を、 subscribeevent 操作中の HTTP レスポンスの Location ヘッダーで提供された subscription URL に設定する
62: event 購読解除リクエスト
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 に設定する
63: event 購読解除レスポンス
HTTP/1.1 204 No Content
8.2.2.3 subscribeallevents

Web Thing のすべての Events を購読する際に使用する events リソースの URL は、 Thing Description の最上位の forms メンバー内で、次を満たす Form を特定することにより、 Thing Description [wot-thing-description11] から取得しなければならない(MUST)。

  • その op メンバーが値 subscribeallevents を含むこと
  • 該当する場合に基底 URL に対して解決された後、 その href メンバーの値の URI scheme [RFC3986] が http または https であること
  • デフォルトが適用された後、その contentType メンバーが application/json の値を持つこと
  • その subprotocol メンバーが webhook の値を持つこと

その後、href メンバーの解決済み値を events リソースの URL として使用しなければならない(MUST)。

Web Thing のすべての Events を購読するために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を events リソースの URL に設定する
  • Content-Type ヘッダーを application/json に設定する
  • 次のメンバーを持つ JSON オブジェクトを含む本文:
    • callbackURL メンバーを、 Thing が event 通知を Consumer に送信するために使用すべき コールバック URL に設定する。
64: すべての events の購読リクエスト
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 リクエストを受信し、 ConsumerThingEvents を購読する権限を持つ場合、 コールバック URL を正常に登録したならば、 Consumer に対して、次を含む HTTP レスポンスを送信しなければならない(MUST)。

  • ステータスコードを 201 Created に設定する
  • Location ヘッダーを、 個別の event サブスクリプションを表す一意の URL に設定する。 これは、後で Consumer がサブスクリプションを キャンセルする際に使用する。
65: すべての events の購読レスポンス
HTTP/1.1 201 Created
Location: /things/events/929dbb69-eb66-46df-a0fe-93701d82e7ea

events サブスクリプションが登録されている間、 event が発生するたびに、Web Thing は、購読している Consumer に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを POST に設定する
  • URL を、 サブスクリプションを登録する際に Consumer が提供した コールバック URL に設定する
  • Content-Type ヘッダーを application/json に設定する(event が データペイロードを含む場合のみ)
  • 対応する event リソースの URL を URL として設定し、 relself に設定した Link ヘッダー
  • ユーザーエージェントにより event が発生した時刻に自動的に設定される Date ヘッダー。 [rfc9110] の HTTP Date 形式を使用する
  • event データペイロード(存在する場合)を含む本文。 JSON でシリアライズされ、 EventAffordance のデータスキーマに適合する

event にデータペイロードが含まれない場合、リクエストの Content-type ヘッダーは 設定すべきではなく(SHOULD NOT)、本文は 空であるべきである。

注記

null、空の引用符 ("")、または空の波括弧 ({}) などの 有効な JSON 値は、有効なデータペイロードである可能性があり、 「空」の本文とはみなされない。

66: event 通知リクエスト
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 に設定する
67: event 通知レスポンス
HTTP/1.1 200 OK
8.2.2.4 unsubscribeallevents

すべての Events へのサブスクリプションをキャンセルするために、 Consumer は、 Web Thing に対して、次を含む HTTP リクエストを送信しなければならない(MUST)。

  • メソッドを DELETE に設定する
  • URL を、 subscribeallevents 操作中の HTTP レスポンスの Location ヘッダーで提供された subscription URL に設定する
68: すべての events の購読解除リクエスト
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 に設定する
69: すべての events の購読解除レスポンス
HTTP/1.1 204 No Content

9. プライバシーに関する考慮事項

WoT Architecture [wot-architecture11] および WoT Thing Description [wot-thing-description11] 仕様のプライバシーに関する考慮事項を考慮に入れるべきである(SHOULD)。

注記

実装上の助言については、WoT Security and Privacy Guidelines [wot-security] も参照すること。

10. セキュリティに関する考慮事項

WoT Architecture [wot-architecture11] および WoT Thing Description [wot-thing-description11] 仕様のセキュリティに関する考慮事項を考慮に入れるべきである(SHOULD)。

注記

実装上の助言については、WoT Security and Privacy Guidelines [wot-security] も参照すること。

11. アクセシビリティに関する考慮事項

Thing Description のすべての レベルにおける title および description メンバーの値は、ユーザー インターフェイスを生成するために使用されることがあるため、必要に応じて 支援技術によってもレンダリングできる、人間が読める文字列であるべきである(SHOULD)。

A. 最近の仕様変更

A.1 2023年1月18日公開の WD からの変更

A.2 2020年11月24日公開の FPWD からの変更

B. 参考文献

B.1 規範的参考文献

[EVENTSOURCE]
Server-Sent Events. Ian Hickson. W3C. 2021年1月28日. W3C 勧告. URL: https://www.w3.org/TR/eventsource/
[JSON]
JavaScript Object Notation (JSON) データ交換 形式. T. Bray, Ed. IETF. 2017年12月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc8259
[RFC2119]
RFC において要求 レベルを示すために用いるキーワード. S. Bradner. IETF. 1997年3月. 現行最良 慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3339]
インターネット上の日付と 時刻: タイムスタンプ. G. Klyne; C. Newman. IETF. 2002年7月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3339
[RFC3986]
Uniform Resource Identifier (URI): 汎用構文. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005年1月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC7807]
HTTP API のための Problem Details. M. Nottingham; E. Wilde. IETF. 2016年3月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7807
[RFC8174]
RFC 2119 キーワードにおける 大文字と小文字の曖昧さ. B. Leiba. IETF. 2017年5月. 現行最良 慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9110.html
[RFC9112]
HTTP/1.1. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9112.html
[URL]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[wot-architecture11]
Web of Things (WoT) Architecture 1.1. Michael Lagally; Ryuichi Matsukura; Kunihiko Toumura; Michael McCool. W3C. 2023年12月5日. W3C 勧告. URL: https://www.w3.org/TR/wot-architecture11/
[wot-binding-templates]
Web of Things (WoT) Binding Templates. Michael Koster; Ege Korkan. W3C. 2024年5月28日. W3C Working Group Note. URL: https://www.w3.org/TR/wot-binding-templates/
[wot-discovery]
Web of Things (WoT) Discovery. Kunihiko Toumura; Michael McCool; Andrea Cimmino; Farshid Tavakolizadeh. W3C. 2023年12月5日. W3C 勧告. URL: https://www.w3.org/TR/wot-discovery/
[wot-thing-description11]
Web of Things (WoT) Thing Description 1.1. Sebastian Käbisch; Michael McCool; Ege Korkan. W3C. 2023年 12月5日. W3C 勧告. URL: https://www.w3.org/TR/wot-thing-description11/
[wot-usecases]
Web of Things (WoT): Use Cases and Requirements. Michael Lagally; Michael McCool; Ryuichi Matsukura; Tomoaki Mizushima. W3C. 2022年3月7日. W3C Working Group Note. URL: https://www.w3.org/TR/wot-usecases/

B.2 参考情報としての参考文献

[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[H2020-CREATE-IoT]
H2020 - CREATE-IoT Project - IoT プラットフォームの共通性と相互運用性プロファイルに関する 推奨事項. IoT European Large-Scale Pilots Programme. 2018-11. 公開済み. URL: https://european-iot-pilots.eu/wp-content/uploads/2018/11/D06_02_WP06_H2020_CREATE-IoT_Final.pdf
[wot-security]
Web of Things (WoT) Security and Privacy Guidelines. Elena Reshetova; Michael McCool. W3C. 2019年11月6日. W3C Working Group Note. URL: https://www.w3.org/TR/wot-security/