Skip to content

Note

このドキュメントは2026-02-27 02:28PLaMo Translation Modelを使用して自動翻訳されました。

FEP-6606: ActivityPubクライアントからサーバーへのコレクションアドレス指定規約

概要

本文書では、[ActivityPub]プロトコルをサポートするサーバー上でのオブジェクトアドレス指定をより適切に実現するため、[Client to Server Interactions]に関する簡潔な規約体系を提案する。主な目的は、IRI(国際化リソース識別子)[RFC-3987]のサブセットを定義するための基本的な語彙を確立し、これをサーバーとクライアント双方に汎用的に適用可能なものとすることである。本提案はクエリパラメータ[RFC-3986]の定義を基盤とし、値に対して適用可能な追加演算子群を導入することで拡張を図っている。

解決すべき課題

クライアントからサーバーへの相互作用が困難とされる主な要因は、公式仕様が実装者の裁量に委ねる部分が多すぎる点にある。コレクションコンテンツのフィルタリング方法に関する規定がないことが、サービスやクライアントにおけるC2S(Client to Server)機能の広範な採用を阻む障壁の一つとなっている。

構文規則

以下の構文はRFC-3986第3.4節から抽出したものであり、URLクエリパラメータを「?」記号以降の文字列(またはURL断片を示す「#」記号まで)として形式的に定義している。

query         = *( pchar / "/" / "?" )

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded   = "%" HEXDIG HEXDIG

sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

ここで注意すべきは、この定義がクエリ文字列をキーと値のペア群として形式的に規定したものではない点である。しかし本提案の目的においては、この解釈が最も重要である。

そこで我々はさらに一歩踏み込み、以下のように定義を拡張する:

query         = *( query-pair [ qconcat ] )

query-pair    = pname [ "=" ( pvalue ) ]

pname         = 1*( pchar )

pvalue        = *( pchar )

pchar         = unreserved / pct-encoded / new-delims / ":" / "@"

qconcat       = "&"

unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded   = "%" HEXDIG HEXDIG

new-delims    = "!" / "$" / "'" / "(" / ")" / "*" / "+" / "," / ";"

クエリ値に付加する演算子を許容するため、この拡張版には以下を追加する:

query-pair    = p-name [ "=" ( [ p-operator ] p-value ) ]

p-operator    = "!" / "~"

p-value       =  empty-value / *( pchar )

empty-value   = "-"

演算子記号として「!」と「~」を使用する。「!」はクエリ値との「相違」を、「~」はテキスト的な意味で「類似性」を意味する。

具体的には、「!」記号が先頭に付いたURLパラメータ値は「~と異なる」と解釈される。同様に「~」記号で前置された値はテキスト的に「~に似ている」と解釈される。

さらに、比較対象値が存在しない場合に使用することができるnil値記号「-」も追加した。

以下の具体例を参照し、これらの規則がどのように適用され、相互に組み合わされるかを確認されたい:

?element=value
// 正確に"value"と一致するリソース

?element=1&element=2
// "1"または"2"と完全に一致するリソース

?element=!value1
// "value1"とは逆の条件を満たすリソース(つまり「~ではない」)

?element=!1&element=!2
// "1"および"2"とは逆の条件を満たすリソース

?element=~fuzzy
// 「fuzzy」と類似するテキストを持つリソース

?element=~one&element=~two
// 「one」または「two」と類似するテキストを持つリソース

?element=-
// "element"値が空であるリソースに一致する

?element=!-
// 全ての非空な"element"値を含むリソースに一致する

ActivityPubコレクションへの適用可能性

本節では、この新たに定義したスキーマを用いて、URLクエリパラメータによるActivityPubコレクションのフィルタリング方法を規定する。

任意のActivityPubコレクションが以下のURLで利用可能であると仮定する:

https://example.com/random-collection

このIRIに対するGETリクエストの応答は、以下のような形式を取り得る:

{
    "@context": "https://www.w3.org/ns/activitystreams",
    "id": "https://example.com/random-collection",
    "name": "Random Collection",
    "type": "OrderedCollection",
    "updated": "2021-04-09T08:16:05Z",
    "first": "https://example.com/random-collection?maxItems=10",
    "totalItems": 12,
    "orderedItems": [ /* ... 簡潔化のため項目を省略 ... */ ]
}

コレクション内の要素に対するフィルタリングは、コレクション内オブジェクトに対して適用したい各種プロパティに対応する名前を持つURLクエリパラメータを用いて行う。

具体例:

https://example.com/random-collection?type=Place

// 「Place」タイプのオブジェクトのみを、Random Collection内で返す

https://example.com/random-collection?summary=~test%20example

// "summary"プロパティに「test example」というテキストを含むオブジェクトのみを返す

実装例

本文書で記述した文法は、[GoActivityPub]ライブラリを使用するサービスがC2Sアドレス指定に採用している機構の簡易版に相当する。

参考文献

著作権

CC0 1.0 Universal(パブリックドメイン献呈)

法律で許容される範囲内において、本Fediverse機能拡張提案の著者らは、当該著作物に関するすべての著作権および関連権利を放棄している。