<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Rest on Tarragon</title><link>https://tarrragon.github.io/blog/tags/rest/</link><description>Recent content in Rest on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 03 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/rest/index.xml" rel="self" type="application/rss+xml"/><item><title>11.C1 Fielding 論文第 5 章：REST 是約束推導的架構風格</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-dissertation-ch5/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-dissertation-ch5/</guid><description>&lt;p>這個案例的核心責任是提供 REST 定義的一手基準、讓各流派的論證有共同錨點。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>REST 在論文中由六個約束從 null style 逐步推導：client-server、stateless、cache、uniform interface、layered system、code-on-demand（optional）。Uniform interface 是 REST 的區別性特徵、由四個子約束構成：resource identification、manipulation through representations、self-descriptive messages、hypermedia as the engine of application state。文中明示 uniform interface 以效率為代價換取一般性與互動可見性。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>這是所有 REST 論爭的 SSoT 錨點 — 純粹派、pragmatic 派、hypermedia 復興派都引用它。教學價值在揭露「REST 是約束集合、不是 URL + JSON + 動詞的 checklist」、並建立「約束是有 trade-off 的推導結果、不是教條」的框架。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a>（定義基準、已引用）、&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模&lt;/a>（representation 概念來源、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm">Architectural Styles and the Design of Network-based Software Architectures, Chapter 5（Roy Fielding、2000）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是提供 REST 定義的一手基準、讓各流派的論證有共同錨點。</p>
<h2 id="觀察">觀察</h2>
<p>REST 在論文中由六個約束從 null style 逐步推導：client-server、stateless、cache、uniform interface、layered system、code-on-demand（optional）。Uniform interface 是 REST 的區別性特徵、由四個子約束構成：resource identification、manipulation through representations、self-descriptive messages、hypermedia as the engine of application state。文中明示 uniform interface 以效率為代價換取一般性與互動可見性。</p>
<h2 id="判讀">判讀</h2>
<p>這是所有 REST 論爭的 SSoT 錨點 — 純粹派、pragmatic 派、hypermedia 復興派都引用它。教學價值在揭露「REST 是約束集合、不是 URL + JSON + 動詞的 checklist」、並建立「約束是有 trade-off 的推導結果、不是教條」的框架。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a>（定義基準、已引用）、<a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模</a>（representation 概念來源、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm">Architectural Styles and the Design of Network-based Software Architectures, Chapter 5（Roy Fielding、2000）</a></li>
</ul>
]]></content:encoded></item><item><title>REST 流派：語意學之爭與 hypermedia 復興</title><link>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/</guid><description>&lt;p>REST 是 API 設計爭論密度最高的一個詞：定義擁有者公開否定業界主流用法、業界照用不誤、復興派再從瀏覽器端重新論證原義的價值。本目錄把這場多方交鋒攤開 — 每方用自己的語言陳述、對錯留給讀者的情境判斷。中性判準層見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意&lt;/a>。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>文章&lt;/th>
 &lt;th>主題&lt;/th>
 &lt;th>案例支撐&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a>&lt;/td>
 &lt;td>定義權爭奪：Fielding 原義、業界慣行、第三方史觀&lt;/td>
 &lt;td>C1、C2、C9、C14（C8 對照）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>&lt;/td>
 &lt;td>復興派論證本體、格式標準化的現實、反方逐條拆解&lt;/td>
 &lt;td>C4-C8、C14&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/" data-link-title="Richardson 成熟度的實用讀法" data-link-desc="RMM 四級當定位與溝通工具的用法、每一級的工程意義、以及把它當合規認證或升級路線圖的誤用邊界">Richardson 成熟度的實用讀法&lt;/a>&lt;/td>
 &lt;td>分級階梯當定位工具、不當合規認證&lt;/td>
 &lt;td>C3&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table></description><content:encoded><![CDATA[<p>REST 是 API 設計爭論密度最高的一個詞：定義擁有者公開否定業界主流用法、業界照用不誤、復興派再從瀏覽器端重新論證原義的價值。本目錄把這場多方交鋒攤開 — 每方用自己的語言陳述、對錯留給讀者的情境判斷。中性判準層見 <a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意</a>。</p>
<table>
  <thead>
      <tr>
          <th>文章</th>
          <th>主題</th>
          <th>案例支撐</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a></td>
          <td>定義權爭奪：Fielding 原義、業界慣行、第三方史觀</td>
          <td>C1、C2、C9、C14（C8 對照）</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a></td>
          <td>復興派論證本體、格式標準化的現實、反方逐條拆解</td>
          <td>C4-C8、C14</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/" data-link-title="Richardson 成熟度的實用讀法" data-link-desc="RMM 四級當定位與溝通工具的用法、每一級的工程意義、以及把它當合規認證或升級路線圖的誤用邊界">Richardson 成熟度的實用讀法</a></td>
          <td>分級階梯當定位工具、不當合規認證</td>
          <td>C3</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item><item><title>REST 語意學之爭：一個詞的定義權爭奪</title><link>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/</guid><description>&lt;p>2000 年的定義原文、2008 年定義者的公開劃線、2020 年的第三方史觀重建 — REST 這個詞的爭論跨越二十多年、三個階段的一手文獻都還在線上。爭的始終是同一件事：這個詞有明確的原始定義者、業界最通行的用法卻跟該定義相距甚遠。本文讓三方各自把話說完；工程溝通上該怎麼處置這個詞、收在結尾。&lt;/p>
&lt;h2 id="原義rest-是約束推導的結果">原義：REST 是約束推導的結果&lt;/h2>
&lt;p>Fielding 的博士論文第 5 章給出 REST 的原始定義方式：從 null style 出發、逐一施加六個架構約束 — client-server、stateless、cache、uniform interface、layered system、code-on-demand（optional）— REST 是這組約束共同推導出的架構風格（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-dissertation-ch5/" data-link-title="11.C1 Fielding 論文第 5 章：REST 是約束推導的架構風格" data-link-desc="REST 由六個約束從 null style 推導而來、uniform interface 以效率換一般性；所有 REST 論爭的定義基準">11.C1&lt;/a>）。&lt;/p>
&lt;p>原義有兩個常被略過的重點。第一、uniform interface 是 REST 跟其他網路架構風格的區別性特徵、它自身再由四個子約束構成：resource identification、manipulation through representations、self-descriptive messages、hypermedia as the engine of application state — HATEOAS 在原義裡是定義的一部分、而非進階選配。第二、論文明文陳述 trade-off：uniform interface 以效率為代價、換取一般性與互動可見性 — 原義自己就把 REST 定位成有成本的選擇、而非普遍最優。&lt;/p>
&lt;h2 id="劃線定義者的公開否定">劃線：定義者的公開否定&lt;/h2>
&lt;p>2008 年、Fielding 在 blog 上對自稱 REST 的 RPC-style API 公開劃線、列出六條規則：協定獨立、不改標準協定、描述精力放在 media type 與 relation name（而非逐 URI 逐方法的文件）、server 擁有自己的 namespace（client 不得假設固定 URI 結構）、resource type 對 client 不可見、所有 application state transition 由 client 從 server 提供的選項中選擇驅動（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-hypertext-driven/" data-link-title="11.C2 Fielding：REST API 必須是 hypertext-driven" data-link-desc="REST 定義擁有者公開否定業界主流用法的引爆點文獻、六條規則劃出 hypertext-driven 的判別線">11.C2&lt;/a>）。&lt;/p>
&lt;p>這篇文章給了爭論一條可操作的判別線：&lt;strong>client 需要 out-of-band 文件才能操作的 API、就通不過 Fielding 意義的 REST&lt;/strong> — 依這條線、絕大多數自稱 RESTful 的 JSON API 都在線的另一側。同一位作者在 2014 年的 InfoQ 訪談把這條立場推進到版本策略：hypermedia 驅動的 API 用執行期演化取代版本號（該立場的展開見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/versioning-and-deprecation/" data-link-title="11.5 版本策略與 deprecation" data-link-desc="版本方案怎麼選（URI/header/date-based）、支援窗口怎麼承諾、舊版怎麼安全退場 — 承諾分期與回收的操作設計">版本策略章&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/versioning-fielding-no-versioning/" data-link-title="11.C14 Fielding：對 API 版本化的建議是「別做」" data-link-desc="no-versioning 流派的理論錨點：hypermedia 演化取代版本號、與運營現實路線分歧的根源">11.C14&lt;/a>）。&lt;/p>
&lt;h2 id="業界慣行的自我辯護">業界慣行的自我辯護&lt;/h2>
&lt;p>業界這一側的論證同樣完整、代表性的立場文逐條拆解 hypermedia 的收益假設：client 開發者實務上讀文件直打 endpoint、不會跟連結走（解耦收益落空）；hypermedia 格式無共識、「不會出現資料版的瀏覽器這種 generic REST client」；hypermedia 傳遞不了資料語意、文件仍不可免；複雜度與 response 膨脹沒有換到等比收益（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-morris-pragmatic-no-hateoas/" data-link-title="11.C8 Ben Morris：不做 hypermedia 的 pragmatic REST（反例對照）" data-link-desc="反例對照：逐條拆 HATEOAS 的收益假設在 machine-to-machine 場景不成立的 pragmatic 派立場文">11.C8&lt;/a>、對照組）。結論是保留 stateless 資源設計的收益、捨 HATEOAS — Twitter、Facebook 等大型 API 被引為這條 pragmatic 路線的成功例。&lt;/p>
&lt;p>這篇的論證方式是整場爭論的關鍵分野：它把爭點放在收益而非定義 — 主張定義裡有一塊在自己的場景不划算、名詞本身未被攻擊（C8 判讀）。這讓兩方的分歧從「誰對」變成「收益前提在誰的場景成立」— 收益假設的逐條交鋒、主寫在 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>2000 年的定義原文、2008 年定義者的公開劃線、2020 年的第三方史觀重建 — REST 這個詞的爭論跨越二十多年、三個階段的一手文獻都還在線上。爭的始終是同一件事：這個詞有明確的原始定義者、業界最通行的用法卻跟該定義相距甚遠。本文讓三方各自把話說完；工程溝通上該怎麼處置這個詞、收在結尾。</p>
<h2 id="原義rest-是約束推導的結果">原義：REST 是約束推導的結果</h2>
<p>Fielding 的博士論文第 5 章給出 REST 的原始定義方式：從 null style 出發、逐一施加六個架構約束 — client-server、stateless、cache、uniform interface、layered system、code-on-demand（optional）— REST 是這組約束共同推導出的架構風格（見 <a href="/blog/backend/11-api-design/cases/rest-fielding-dissertation-ch5/" data-link-title="11.C1 Fielding 論文第 5 章：REST 是約束推導的架構風格" data-link-desc="REST 由六個約束從 null style 推導而來、uniform interface 以效率換一般性；所有 REST 論爭的定義基準">11.C1</a>）。</p>
<p>原義有兩個常被略過的重點。第一、uniform interface 是 REST 跟其他網路架構風格的區別性特徵、它自身再由四個子約束構成：resource identification、manipulation through representations、self-descriptive messages、hypermedia as the engine of application state — HATEOAS 在原義裡是定義的一部分、而非進階選配。第二、論文明文陳述 trade-off：uniform interface 以效率為代價、換取一般性與互動可見性 — 原義自己就把 REST 定位成有成本的選擇、而非普遍最優。</p>
<h2 id="劃線定義者的公開否定">劃線：定義者的公開否定</h2>
<p>2008 年、Fielding 在 blog 上對自稱 REST 的 RPC-style API 公開劃線、列出六條規則：協定獨立、不改標準協定、描述精力放在 media type 與 relation name（而非逐 URI 逐方法的文件）、server 擁有自己的 namespace（client 不得假設固定 URI 結構）、resource type 對 client 不可見、所有 application state transition 由 client 從 server 提供的選項中選擇驅動（見 <a href="/blog/backend/11-api-design/cases/rest-fielding-hypertext-driven/" data-link-title="11.C2 Fielding：REST API 必須是 hypertext-driven" data-link-desc="REST 定義擁有者公開否定業界主流用法的引爆點文獻、六條規則劃出 hypertext-driven 的判別線">11.C2</a>）。</p>
<p>這篇文章給了爭論一條可操作的判別線：<strong>client 需要 out-of-band 文件才能操作的 API、就通不過 Fielding 意義的 REST</strong> — 依這條線、絕大多數自稱 RESTful 的 JSON API 都在線的另一側。同一位作者在 2014 年的 InfoQ 訪談把這條立場推進到版本策略：hypermedia 驅動的 API 用執行期演化取代版本號（該立場的展開見 <a href="/blog/backend/11-api-design/versioning-and-deprecation/" data-link-title="11.5 版本策略與 deprecation" data-link-desc="版本方案怎麼選（URI/header/date-based）、支援窗口怎麼承諾、舊版怎麼安全退場 — 承諾分期與回收的操作設計">版本策略章</a> 與 <a href="/blog/backend/11-api-design/cases/versioning-fielding-no-versioning/" data-link-title="11.C14 Fielding：對 API 版本化的建議是「別做」" data-link-desc="no-versioning 流派的理論錨點：hypermedia 演化取代版本號、與運營現實路線分歧的根源">11.C14</a>）。</p>
<h2 id="業界慣行的自我辯護">業界慣行的自我辯護</h2>
<p>業界這一側的論證同樣完整、代表性的立場文逐條拆解 hypermedia 的收益假設：client 開發者實務上讀文件直打 endpoint、不會跟連結走（解耦收益落空）；hypermedia 格式無共識、「不會出現資料版的瀏覽器這種 generic REST client」；hypermedia 傳遞不了資料語意、文件仍不可免；複雜度與 response 膨脹沒有換到等比收益（見 <a href="/blog/backend/11-api-design/cases/rest-morris-pragmatic-no-hateoas/" data-link-title="11.C8 Ben Morris：不做 hypermedia 的 pragmatic REST（反例對照）" data-link-desc="反例對照：逐條拆 HATEOAS 的收益假設在 machine-to-machine 場景不成立的 pragmatic 派立場文">11.C8</a>、對照組）。結論是保留 stateless 資源設計的收益、捨 HATEOAS — Twitter、Facebook 等大型 API 被引為這條 pragmatic 路線的成功例。</p>
<p>這篇的論證方式是整場爭論的關鍵分野：它把爭點放在收益而非定義 — 主張定義裡有一塊在自己的場景不划算、名詞本身未被攻擊（C8 判讀）。這讓兩方的分歧從「誰對」變成「收益前提在誰的場景成立」— 收益假設的逐條交鋒、主寫在 <a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>。</p>
<h2 id="第三方史觀挪用但自成合理架構">第三方史觀：挪用、但自成合理架構</h2>
<p>第三方的歷史考據給了這場爭論一個雙方都不冤枉的定調（見 <a href="/blog/backend/11-api-design/cases/rest-twobithistory-misappropriation/" data-link-title="11.C9 twobithistory：被挪用的 REST 論文（史觀對照）" data-link-desc="第三方歷史考據：論文談的是 HTTP/1.1 設計而非 API 建構、業界棄 SOAP 時把 pragmatic 用法掛上 REST 名字；二手來源">11.C9</a>、二手來源）：論文寫於 2000 年、談的是 HTTP/1.1 的設計理據、當時「web API」尚不存在；業界在棄 SOAP 時需要一面學術大旗、把 pragmatic 的 HTTP 用法掛上了 REST 的名字；Rails 2007 移除 SOAP 支援是這場轉向的符號性節點。史觀的結論止於此：名字確實被挪用、但挪用後的做法自成合理架構。把這個定調再推一步是本文的判讀：這套慣行 — 資源化 URL、正確的 method 與 status 語意、JSON 表徵 — 缺的只是一個不與原義衝突的名字。</p>
<h2 id="這場爭論對工程溝通的用處">這場爭論對工程溝通的用處</h2>
<p>定義權之爭本身沒有工程結論、但它對日常溝通有三個直接可用的產出。第一、<strong>跨團隊溝通時把詞說死</strong>：「REST」在 API design review 裡是歧義詞、規範文件（<a href="/blog/backend/11-api-design/api-governance/" data-link-title="11.10 API 規範治理" data-link-desc="設計規範怎麼讓幾十個團隊持續遵守 — 提案制、Guild 制、分軌制的治理模式比較、linting 進 CI、規範失敗的成因">11.10 治理</a> 的 guidelines）該明文定義自家用法 — 多數組織的誠實寫法是「HTTP+JSON、資源導向、Richardson Level 2」、而非裸的 RESTful。第二、<strong>判別線當設計問句用</strong>：「這個 client 需要多少 out-of-band 知識」是好問題、無論最終給出哪一側的答案。第三、<strong>引用要對版本</strong>：引 Fielding 支持自己的 URL 命名慣例、引到的多半是業界慣行而非原義 — 這類錯位引用在 style guide 裡很常見、寫規範時值得回一手來源核對。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>復興派的完整論證與反方交鋒：<a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a></li>
<li>分級定位工具：<a href="/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/" data-link-title="Richardson 成熟度的實用讀法" data-link-desc="RMM 四級當定位與溝通工具的用法、每一級的工程意義、以及把它當合規認證或升級路線圖的誤用邊界">Richardson 成熟度的實用讀法</a></li>
<li>中性判準層：<a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意</a></li>
<li>案例原文：<a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a></li>
</ul>
]]></content:encoded></item><item><title>11.C2 Fielding：REST API 必須是 hypertext-driven</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-hypertext-driven/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fielding-hypertext-driven/</guid><description>&lt;p>這個案例的核心責任是記錄「語意學之爭」的引爆點：定義擁有者親自劃線。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>Fielding 在 2008 年的 blog 文列出六條 REST API 規則：協定獨立、不改標準協定、描述精力放在 media type 與 relation name（而非逐 URI 逐方法的文件）、server 必須擁有自己的 namespace（client 不得假設固定 URI 結構）、resource type 對 client 不可見、所有 application state transition 必須由 client 從 server 提供的選項中選擇驅動。文中直接批評自稱 REST 的 RPC-style API 造成過度耦合。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>教學判準：「client 是否需要 out-of-band 文件才能操作 — 需要、就不是 Fielding 意義的 REST」。同時揭露命名權之爭：術語定義者與業界慣行的張力、是流派層敘事的起點。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a>（核心案例、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">REST APIs must be hypertext-driven（Roy Fielding blog、2008）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是記錄「語意學之爭」的引爆點：定義擁有者親自劃線。</p>
<h2 id="觀察">觀察</h2>
<p>Fielding 在 2008 年的 blog 文列出六條 REST API 規則：協定獨立、不改標準協定、描述精力放在 media type 與 relation name（而非逐 URI 逐方法的文件）、server 必須擁有自己的 namespace（client 不得假設固定 URI 結構）、resource type 對 client 不可見、所有 application state transition 必須由 client 從 server 提供的選項中選擇驅動。文中直接批評自稱 REST 的 RPC-style API 造成過度耦合。</p>
<h2 id="判讀">判讀</h2>
<p>教學判準：「client 是否需要 out-of-band 文件才能操作 — 需要、就不是 Fielding 意義的 REST」。同時揭露命名權之爭：術語定義者與業界慣行的張力、是流派層敘事的起點。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a>（核心案例、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">REST APIs must be hypertext-driven（Roy Fielding blog、2008）</a></li>
</ul>
]]></content:encoded></item><item><title>Hypermedia 與 HATEOAS 復興</title><link>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/</guid><description>&lt;p>Hypermedia 復興派的論證錨在一個可檢驗的工程性質上：&lt;strong>application state 的可用轉移由 server 編碼在回應裡、client 不持有業務知識 — 這個性質只在存在 uniform client 時兌現、而瀏覽器就是那個 uniform client&lt;/strong>。本文攤開這條論證的完整結構、格式標準化的失敗現實、以及反方的逐條拆解。HATEOAS 有無的操作型判別法（available actions 由誰計算）與最小範例、主寫在 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 的建模層&lt;/a> — 本文的 lens 是流派論證本體、兩處分工不同。&lt;/p>
&lt;h2 id="語意漂移史復興派的問題意識">語意漂移史：復興派的問題意識&lt;/h2>
&lt;p>復興派的論證起點是一段歷史重建（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/" data-link-title="11.C4 Carson Gross：REST 如何變成 REST 的反義詞" data-link-desc="hypermedia 復興派的語意漂移史重建：JSON 取代 XML、業界停在 Level 2、SPA 脫鉤到 GraphQL 放棄名義">11.C4&lt;/a>）：XML-RPC 與 SOAP 世代之後、JSON 取代 XML 成為 API 的通用格式 — 但 JSON 是純資料格式、不是 hypertext、hypermedia controls 沒有了自然的載體；Richardson 成熟度模型普及、業界集體停在 Level 2；SPA 興起讓前端與 REST 原則脫鉤；GraphQL 最後乾脆放棄 REST 名義。重建的結論：今日的 JSON API 是掛著 REST 名字的 RPC、真正 hypermedia-driven 的回應形式是 HTML。&lt;/p>
&lt;p>C4 的判讀從這段敘事抽出整場爭論的樞紐 — 一個兩派共享的觀察：&lt;strong>REST 的 self-describing 特性是為 uniform client（瀏覽器）設計的、machine-to-machine 的 JSON 生態並不存在這種 client&lt;/strong>。復興派從這個觀察推出「所以回到 HTML、讓瀏覽器當 uniform client」；pragmatic 派從同一個觀察推出「所以 machine-to-machine 場景放棄 hypermedia」— 同一個前提、兩個方向的合理結論、分歧點在 consumer 是誰。&lt;/p>
&lt;h2 id="復興論證的正面版本">復興論證的正面版本&lt;/h2>
&lt;p>htmx 一系的 essays 把復興論證落到具體工程性質：業務狀態直接編碼在可用操作裡、client 端零業務邏輯（範例層見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-htmx-hateoas-html-necessity/" data-link-title="11.C5 htmx HATEOAS essay：透支帳戶的兩種表徵對照" data-link-desc="同一個 domain 狀態的 HTML 與 JSON 表徵耦合差異、HATEOAS 有無的操作型判別法">11.C5&lt;/a> 與 11.3 的展開）。從這個性質推下去（本文判讀）：狀態機改版時只有 server 要改、部署即生效、沒有 client 端的版本滯後 — hypermedia 於是成為 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/versioning-and-deprecation/" data-link-title="11.5 版本策略與 deprecation" data-link-desc="版本方案怎麼選（URI/header/date-based）、支援窗口怎麼承諾、舊版怎麼安全退場 — 承諾分期與回收的操作設計">版本策略&lt;/a> 的另一種解法：Fielding 的 no-versioning 立場（InfoQ 訪談、見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/versioning-fielding-no-versioning/" data-link-title="11.C14 Fielding：對 API 版本化的建議是「別做」" data-link-desc="no-versioning 流派的理論錨點：hypermedia 演化取代版本號、與運營現實路線分歧的根源">11.C14&lt;/a>）在 hypermedia 前提下是自洽的 — 控制項在執行期習得、演化不需要版本號。&lt;/p>
&lt;p>論證同時對 GraphQL 保留了讓步：thick-client 場景（client 本來就要持有大量邏輯）用 GraphQL 是合理選擇（此讓步出自 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/" data-link-title="11.C4 Carson Gross：REST 如何變成 REST 的反義詞" data-link-desc="hypermedia 復興派的語意漂移史重建：JSON 取代 XML、業界停在 Level 2、SPA 脫鉤到 GraphQL 放棄名義">11.C4&lt;/a> 的漂移史敘事）— 復興派的攻擊對象是「掛 REST 名的 JSON RPC」、而非所有非 hypermedia 的設計。&lt;/p>
&lt;h2 id="格式標準化的現實json-上補-hypermedia-的失敗">格式標準化的現實：JSON 上補 hypermedia 的失敗&lt;/h2>
&lt;p>復興論證有一個要正面回答的歷史事實：在 JSON 上疊 hypermedia controls 的嘗試、生態上失敗了。HAL 用 &lt;code>_links&lt;/code> 與 &lt;code>_embedded&lt;/code> 兩個保留屬性做最小侵入的 hypermedia 化、有 spec、有生態（曾是 Spring HATEOAS 預設格式）、標準化止步於過期的 IETF draft（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-kelly-hal-spec/" data-link-title="11.C6 HAL spec：JSON hypermedia 標準化的過期 draft" data-link-desc="在 JSON 上補 hypermedia 最接近成功的一次：有 spec 有生態、標準化止步於過期 IETF draft">11.C6&lt;/a>）。Siren 走表達力路線、first-class 的 &lt;code>actions&lt;/code> 帶 method 與欄位、比 HAL 更接近 HTML form 的 JSON 化 — 採用反而更少、release 停在 2017（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-swiber-siren-adoption/" data-link-title="11.C7 Siren spec：表達力更完整、採用曲線停滯" data-link-desc="帶 first-class actions 的 hypermedia 格式、表達力勝 HAL 而採用更少；client 生態決定格式命運的證據">11.C7&lt;/a>）。&lt;/p></description><content:encoded><![CDATA[<p>Hypermedia 復興派的論證錨在一個可檢驗的工程性質上：<strong>application state 的可用轉移由 server 編碼在回應裡、client 不持有業務知識 — 這個性質只在存在 uniform client 時兌現、而瀏覽器就是那個 uniform client</strong>。本文攤開這條論證的完整結構、格式標準化的失敗現實、以及反方的逐條拆解。HATEOAS 有無的操作型判別法（available actions 由誰計算）與最小範例、主寫在 <a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 的建模層</a> — 本文的 lens 是流派論證本體、兩處分工不同。</p>
<h2 id="語意漂移史復興派的問題意識">語意漂移史：復興派的問題意識</h2>
<p>復興派的論證起點是一段歷史重建（見 <a href="/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/" data-link-title="11.C4 Carson Gross：REST 如何變成 REST 的反義詞" data-link-desc="hypermedia 復興派的語意漂移史重建：JSON 取代 XML、業界停在 Level 2、SPA 脫鉤到 GraphQL 放棄名義">11.C4</a>）：XML-RPC 與 SOAP 世代之後、JSON 取代 XML 成為 API 的通用格式 — 但 JSON 是純資料格式、不是 hypertext、hypermedia controls 沒有了自然的載體；Richardson 成熟度模型普及、業界集體停在 Level 2；SPA 興起讓前端與 REST 原則脫鉤；GraphQL 最後乾脆放棄 REST 名義。重建的結論：今日的 JSON API 是掛著 REST 名字的 RPC、真正 hypermedia-driven 的回應形式是 HTML。</p>
<p>C4 的判讀從這段敘事抽出整場爭論的樞紐 — 一個兩派共享的觀察：<strong>REST 的 self-describing 特性是為 uniform client（瀏覽器）設計的、machine-to-machine 的 JSON 生態並不存在這種 client</strong>。復興派從這個觀察推出「所以回到 HTML、讓瀏覽器當 uniform client」；pragmatic 派從同一個觀察推出「所以 machine-to-machine 場景放棄 hypermedia」— 同一個前提、兩個方向的合理結論、分歧點在 consumer 是誰。</p>
<h2 id="復興論證的正面版本">復興論證的正面版本</h2>
<p>htmx 一系的 essays 把復興論證落到具體工程性質：業務狀態直接編碼在可用操作裡、client 端零業務邏輯（範例層見 <a href="/blog/backend/11-api-design/cases/rest-htmx-hateoas-html-necessity/" data-link-title="11.C5 htmx HATEOAS essay：透支帳戶的兩種表徵對照" data-link-desc="同一個 domain 狀態的 HTML 與 JSON 表徵耦合差異、HATEOAS 有無的操作型判別法">11.C5</a> 與 11.3 的展開）。從這個性質推下去（本文判讀）：狀態機改版時只有 server 要改、部署即生效、沒有 client 端的版本滯後 — hypermedia 於是成為 <a href="/blog/backend/11-api-design/versioning-and-deprecation/" data-link-title="11.5 版本策略與 deprecation" data-link-desc="版本方案怎麼選（URI/header/date-based）、支援窗口怎麼承諾、舊版怎麼安全退場 — 承諾分期與回收的操作設計">版本策略</a> 的另一種解法：Fielding 的 no-versioning 立場（InfoQ 訪談、見 <a href="/blog/backend/11-api-design/cases/versioning-fielding-no-versioning/" data-link-title="11.C14 Fielding：對 API 版本化的建議是「別做」" data-link-desc="no-versioning 流派的理論錨點：hypermedia 演化取代版本號、與運營現實路線分歧的根源">11.C14</a>）在 hypermedia 前提下是自洽的 — 控制項在執行期習得、演化不需要版本號。</p>
<p>論證同時對 GraphQL 保留了讓步：thick-client 場景（client 本來就要持有大量邏輯）用 GraphQL 是合理選擇（此讓步出自 <a href="/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/" data-link-title="11.C4 Carson Gross：REST 如何變成 REST 的反義詞" data-link-desc="hypermedia 復興派的語意漂移史重建：JSON 取代 XML、業界停在 Level 2、SPA 脫鉤到 GraphQL 放棄名義">11.C4</a> 的漂移史敘事）— 復興派的攻擊對象是「掛 REST 名的 JSON RPC」、而非所有非 hypermedia 的設計。</p>
<h2 id="格式標準化的現實json-上補-hypermedia-的失敗">格式標準化的現實：JSON 上補 hypermedia 的失敗</h2>
<p>復興論證有一個要正面回答的歷史事實：在 JSON 上疊 hypermedia controls 的嘗試、生態上失敗了。HAL 用 <code>_links</code> 與 <code>_embedded</code> 兩個保留屬性做最小侵入的 hypermedia 化、有 spec、有生態（曾是 Spring HATEOAS 預設格式）、標準化止步於過期的 IETF draft（見 <a href="/blog/backend/11-api-design/cases/rest-kelly-hal-spec/" data-link-title="11.C6 HAL spec：JSON hypermedia 標準化的過期 draft" data-link-desc="在 JSON 上補 hypermedia 最接近成功的一次：有 spec 有生態、標準化止步於過期 IETF draft">11.C6</a>）。Siren 走表達力路線、first-class 的 <code>actions</code> 帶 method 與欄位、比 HAL 更接近 HTML form 的 JSON 化 — 採用反而更少、release 停在 2017（見 <a href="/blog/backend/11-api-design/cases/rest-swiber-siren-adoption/" data-link-title="11.C7 Siren spec：表達力更完整、採用曲線停滯" data-link-desc="帶 first-class actions 的 hypermedia 格式、表達力勝 HAL 而採用更少；client 生態決定格式命運的證據">11.C7</a>）。</p>
<p>兩案並排的判讀：表達力不是 hypermedia 格式勝出的變數、client 生態才是 — HAL、Siren、JSON-LD、Collection+JSON 並立無一勝出、uniform client 沒有形成、每個消費者仍要為每個 API 寫專屬邏輯、hypermedia 的收益前提落空。這個碎片化現實同時支撐兩派：復興派引它證明「JSON 不是 natural hypermedia、所以回到 HTML」；pragmatic 派引它證明「別等標準收斂、直接放棄 controls」。</p>
<h2 id="反方的收益假設拆解">反方的收益假設拆解</h2>
<p>Pragmatic 派的拆解針對的是收益假設而非名詞；本文把 C8 記錄的論據重組為三條假設逐一對應（重組是本文整理、原文論據見 <a href="/blog/backend/11-api-design/cases/rest-morris-pragmatic-no-hateoas/" data-link-title="11.C8 Ben Morris：不做 hypermedia 的 pragmatic REST（反例對照）" data-link-desc="反例對照：逐條拆 HATEOAS 的收益假設在 machine-to-machine 場景不成立的 pragmatic 派立場文">11.C8</a>、對照組）：解耦（decoupling）— client 開發者實務上讀文件直打 endpoint、不跟連結走；可發現性（discoverability）— hypermedia 格式無共識、「不會出現資料版的瀏覽器這種 generic REST client」；可演化性（evolvability）— hypermedia 傳遞不了資料語意、文件仍不可免。三條拆解共享同一個前提：消費者是程式、不是人 — 把這個前提換掉（消費者是瀏覽器後面的人）、三條拆解全部失效、這正是 htmx 一系在 web UI 場景成立的原因。</p>
<h2 id="適用邊界">適用邊界</h2>
<p>把兩派論證疊起來、hypermedia 的適用邊界可以畫得相當清楚。收益前提成立的場景：consumer 是瀏覽器（或任何會 render hypermedia 的 uniform client）、UI 由 server 驅動、業務狀態機常變 — server-rendered web 應用、後台管理介面、htmx 式的漸進增強前端。收益前提不成立的場景：machine-to-machine 整合、第三方開發者寫程式消費、mobile app 內建業務邏輯 — 這些場景的務實選擇是「狀態欄位 + 明文狀態機」路線（判準見 <a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3</a>）。誤區是把邊界問題當立場問題：同一個組織可以對外 API 走 pragmatic、後台 UI 走 hypermedia、兩者引用的是同一組論證的不同半邊。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>這個詞的定義權爭奪全景：<a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a></li>
<li>判別法與建模層判準：<a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意</a></li>
<li>no-versioning 立場的版本策略語境：<a href="/blog/backend/11-api-design/versioning-and-deprecation/" data-link-title="11.5 版本策略與 deprecation" data-link-desc="版本方案怎麼選（URI/header/date-based）、支援窗口怎麼承諾、舊版怎麼安全退場 — 承諾分期與回收的操作設計">11.5 版本策略與 deprecation</a></li>
<li>案例原文：<a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a></li>
</ul>
]]></content:encoded></item><item><title>11.C3 Richardson 成熟度模型：分級階梯與它的自我聲明</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fowler-richardson-maturity-model/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fowler-richardson-maturity-model/</guid><description>&lt;p>這個案例的核心責任是提供業界最通行的 REST 教學階梯、以及它「不是 REST 認證」的原始 caveat。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>模型分四級：Level 0（HTTP 當 RPC 隧道、單一 endpoint）、Level 1（資源化、逐資源 URI）、Level 2（HTTP 動詞與狀態碼正確使用）、Level 3（hypermedia controls / HATEOAS）。Fowler 明文標注：RMM 是理解 REST 元素的思考工具、不是 REST 的分級定義；並記錄 Fielding 的立場 — 只有 Level 3 才算 REST。模型本身出自 Richardson 的 QCon 演講、此文屬權威轉述。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>教學價值在雙重性：用 RMM 定位自己的 API 在哪一級是合法用法、拿 RMM 當 REST 認證是誤用。它也是「業界普遍停在 Level 2」這個實證現象的參照系。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/" data-link-title="Richardson 成熟度的實用讀法" data-link-desc="RMM 四級當定位與溝通工具的用法、每一級的工程意義、以及把它當合規認證或升級路線圖的誤用邊界">Richardson 成熟度的實用讀法&lt;/a>（骨幹、已引用）、11.3 資源建模（定位工具段、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://martinfowler.com/articles/richardsonMaturityModel.html">Richardson Maturity Model（Martin Fowler、2010）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是提供業界最通行的 REST 教學階梯、以及它「不是 REST 認證」的原始 caveat。</p>
<h2 id="觀察">觀察</h2>
<p>模型分四級：Level 0（HTTP 當 RPC 隧道、單一 endpoint）、Level 1（資源化、逐資源 URI）、Level 2（HTTP 動詞與狀態碼正確使用）、Level 3（hypermedia controls / HATEOAS）。Fowler 明文標注：RMM 是理解 REST 元素的思考工具、不是 REST 的分級定義；並記錄 Fielding 的立場 — 只有 Level 3 才算 REST。模型本身出自 Richardson 的 QCon 演講、此文屬權威轉述。</p>
<h2 id="判讀">判讀</h2>
<p>教學價值在雙重性：用 RMM 定位自己的 API 在哪一級是合法用法、拿 RMM 當 REST 認證是誤用。它也是「業界普遍停在 Level 2」這個實證現象的參照系。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/" data-link-title="Richardson 成熟度的實用讀法" data-link-desc="RMM 四級當定位與溝通工具的用法、每一級的工程意義、以及把它當合規認證或升級路線圖的誤用邊界">Richardson 成熟度的實用讀法</a>（骨幹、已引用）、11.3 資源建模（定位工具段、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://martinfowler.com/articles/richardsonMaturityModel.html">Richardson Maturity Model（Martin Fowler、2010）</a></li>
</ul>
]]></content:encoded></item><item><title>Richardson 成熟度的實用讀法</title><link>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/richardson-maturity-practical-reading/</guid><description>&lt;p>Richardson 成熟度模型（RMM）是一把定位尺、而非一張認證考卷 — 這個定位出自一手來源自己的聲明：Fowler 在記述這個模型時明文標注、RMM 是理解 REST 元素的思考工具、不是 REST 的分級定義（見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-fowler-richardson-maturity-model/" data-link-title="11.C3 Richardson 成熟度模型：分級階梯與它的自我聲明" data-link-desc="RMM 四級是理解 REST 元素的思考工具、一手來源自己警告它不是 REST 分級定義；業界停在 Level 2 的參照系">11.C3&lt;/a>）。下面依序看四級各自解決什麼、以及常見誤用的邊界在哪。&lt;/p>
&lt;h2 id="四級的工程意義">四級的工程意義&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>級別&lt;/th>
 &lt;th>特徵&lt;/th>
 &lt;th>這一級解決什麼&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Level 0&lt;/td>
 &lt;td>HTTP 當 RPC 隧道、單一 endpoint&lt;/td>
 &lt;td>只把 HTTP 當傳輸、所有語意自己發明&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Level 1&lt;/td>
 &lt;td>資源化、逐資源 URI&lt;/td>
 &lt;td>介面有了名詞結構、權限與路由可以按資源切&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Level 2&lt;/td>
 &lt;td>HTTP method 與 status 正確使用&lt;/td>
 &lt;td>中介層基礎設施（快取、重試、監控）開始能讀懂介面&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Level 3&lt;/td>
 &lt;td>Hypermedia controls（HATEOAS）&lt;/td>
 &lt;td>client 從回應習得可用操作、業務知識收回 server&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>表格是索引、每級的躍遷各有實質收益。Level 0 到 1 的收益是結構：橫切能力（權限、審計、快取鍵）有了掛載單位。Level 1 到 2 的收益是讓基礎設施當盟友：GET 的安全承諾讓 proxy 敢快取、status 的語意讓監控與重試鏈正確運作 — method 與 status 作為承諾的完整判準在 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3&lt;/a>。Level 2 到 3 的收益是解耦 client 的業務知識 — 但這一級的收益前提（存在會跟連結走的 uniform client）在 machine-to-machine 場景多半不成立、完整交鋒見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>。&lt;/p>
&lt;h2 id="兩個立場事實">兩個立場事實&lt;/h2>
&lt;p>用 RMM 之前要知道它在爭論光譜上的位置。其一、Fielding 的立場被 Fowler 記錄在案：只有 Level 3 才算 REST — 依原義、RMM 的前三級都是「還不是 REST」的程度差異、把 Level 2 說成「基本 REST」與原始定義者的立場直接牴觸（定義權爭奪的全景見 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a>）。其二、業界實務多停在 Level 2 — 這是廣泛的觀察、C3 案例的判讀層也如此標注、Fowler 原文沒有這個統計主張、引用時分清楚。&lt;/p>
&lt;h2 id="誤用一當合規檢查表">誤用一：當合規檢查表&lt;/h2>
&lt;p>「我們的 API 要通過 Level 2 審查」這類用法把定位尺變成認證考卷、產生兩種浪費。輕的浪費是形式主義：為了「正確使用 PATCH」而在沒有部分更新需求的資源上硬加 PATCH、級別達標、介面多了沒人用的表面積。重的浪費是誤導優先序：Level 2 的實質收益是中介層能讀懂介面 — 檢查的對象該是「快取有沒有實際命中、重試鏈行為是否正確」、而非 method 使用的字面合規。合規檢查表要從自家的 breaking 清單與錯誤模型長出來（&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/backward-compatibility-discipline/" data-link-title="11.6 向後相容的變更紀律" data-link-desc="哪些變更算 breaking、相容性檢查放人工還是 CI、檢查粒度怎麼選 — 讓介面變更可審可擋的日常紀律">11.6&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/error-model-design/" data-link-title="11.4 錯誤模型設計" data-link-desc="錯誤該分幾類、格式怎麼定才有演化空間、機器判讀跟人類訊息怎麼分工 — 錯誤作為契約一級公民的設計判準">11.4&lt;/a>）、RMM 的粒度撐不起這個角色。&lt;/p>
&lt;h2 id="誤用二當升級路線圖">誤用二：當升級路線圖&lt;/h2>
&lt;p>「今年 Level 2、明年 Level 3」把分級讀成演進方向、隱含「越高越好」— 但 Level 3 的收益前提跟前兩級不同質：前兩級的收益（結構、基礎設施相容）幾乎無條件成立、Level 3 的收益依賴 uniform client 的存在。machine-to-machine API 升到 Level 3、成本照付（回應膨脹、格式選型、server 端組裝 controls）、收益不兌現 — 停在 Level 2 對多數 API 是刻意且正確的終點、而非未完成狀態。&lt;/p></description><content:encoded><![CDATA[<p>Richardson 成熟度模型（RMM）是一把定位尺、而非一張認證考卷 — 這個定位出自一手來源自己的聲明：Fowler 在記述這個模型時明文標注、RMM 是理解 REST 元素的思考工具、不是 REST 的分級定義（見 <a href="/blog/backend/11-api-design/cases/rest-fowler-richardson-maturity-model/" data-link-title="11.C3 Richardson 成熟度模型：分級階梯與它的自我聲明" data-link-desc="RMM 四級是理解 REST 元素的思考工具、一手來源自己警告它不是 REST 分級定義；業界停在 Level 2 的參照系">11.C3</a>）。下面依序看四級各自解決什麼、以及常見誤用的邊界在哪。</p>
<h2 id="四級的工程意義">四級的工程意義</h2>
<table>
  <thead>
      <tr>
          <th>級別</th>
          <th>特徵</th>
          <th>這一級解決什麼</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Level 0</td>
          <td>HTTP 當 RPC 隧道、單一 endpoint</td>
          <td>只把 HTTP 當傳輸、所有語意自己發明</td>
      </tr>
      <tr>
          <td>Level 1</td>
          <td>資源化、逐資源 URI</td>
          <td>介面有了名詞結構、權限與路由可以按資源切</td>
      </tr>
      <tr>
          <td>Level 2</td>
          <td>HTTP method 與 status 正確使用</td>
          <td>中介層基礎設施（快取、重試、監控）開始能讀懂介面</td>
      </tr>
      <tr>
          <td>Level 3</td>
          <td>Hypermedia controls（HATEOAS）</td>
          <td>client 從回應習得可用操作、業務知識收回 server</td>
      </tr>
  </tbody>
</table>
<p>表格是索引、每級的躍遷各有實質收益。Level 0 到 1 的收益是結構：橫切能力（權限、審計、快取鍵）有了掛載單位。Level 1 到 2 的收益是讓基礎設施當盟友：GET 的安全承諾讓 proxy 敢快取、status 的語意讓監控與重試鏈正確運作 — method 與 status 作為承諾的完整判準在 <a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3</a>。Level 2 到 3 的收益是解耦 client 的業務知識 — 但這一級的收益前提（存在會跟連結走的 uniform client）在 machine-to-machine 場景多半不成立、完整交鋒見 <a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>。</p>
<h2 id="兩個立場事實">兩個立場事實</h2>
<p>用 RMM 之前要知道它在爭論光譜上的位置。其一、Fielding 的立場被 Fowler 記錄在案：只有 Level 3 才算 REST — 依原義、RMM 的前三級都是「還不是 REST」的程度差異、把 Level 2 說成「基本 REST」與原始定義者的立場直接牴觸（定義權爭奪的全景見 <a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a>）。其二、業界實務多停在 Level 2 — 這是廣泛的觀察、C3 案例的判讀層也如此標注、Fowler 原文沒有這個統計主張、引用時分清楚。</p>
<h2 id="誤用一當合規檢查表">誤用一：當合規檢查表</h2>
<p>「我們的 API 要通過 Level 2 審查」這類用法把定位尺變成認證考卷、產生兩種浪費。輕的浪費是形式主義：為了「正確使用 PATCH」而在沒有部分更新需求的資源上硬加 PATCH、級別達標、介面多了沒人用的表面積。重的浪費是誤導優先序：Level 2 的實質收益是中介層能讀懂介面 — 檢查的對象該是「快取有沒有實際命中、重試鏈行為是否正確」、而非 method 使用的字面合規。合規檢查表要從自家的 breaking 清單與錯誤模型長出來（<a href="/blog/backend/11-api-design/backward-compatibility-discipline/" data-link-title="11.6 向後相容的變更紀律" data-link-desc="哪些變更算 breaking、相容性檢查放人工還是 CI、檢查粒度怎麼選 — 讓介面變更可審可擋的日常紀律">11.6</a>、<a href="/blog/backend/11-api-design/error-model-design/" data-link-title="11.4 錯誤模型設計" data-link-desc="錯誤該分幾類、格式怎麼定才有演化空間、機器判讀跟人類訊息怎麼分工 — 錯誤作為契約一級公民的設計判準">11.4</a>）、RMM 的粒度撐不起這個角色。</p>
<h2 id="誤用二當升級路線圖">誤用二：當升級路線圖</h2>
<p>「今年 Level 2、明年 Level 3」把分級讀成演進方向、隱含「越高越好」— 但 Level 3 的收益前提跟前兩級不同質：前兩級的收益（結構、基礎設施相容）幾乎無條件成立、Level 3 的收益依賴 uniform client 的存在。machine-to-machine API 升到 Level 3、成本照付（回應膨脹、格式選型、server 端組裝 controls）、收益不兌現 — 停在 Level 2 對多數 API 是刻意且正確的終點、而非未完成狀態。</p>
<h2 id="實用讀法">實用讀法</h2>
<p>RMM 最好的用法是三種對話場景。<strong>定位</strong>：「我們的公開 API 在 Level 2、後台 HTML 介面實質上是 Level 3」— 一句話讓新成員理解兩套介面的設計差異。<strong>驗傷</strong>：接手遺留系統時、「這批 endpoint 在 Level 0（全部 POST 打一個 /api）」直接指出重構的第一刀在資源化、而非欄位微調。<strong>止損</strong>：design review 有人提議「往 Level 3 走」時、RMM 的級別語言讓討論快速聚焦到真正的問題 —「我們的 consumer 是誰、誰會跟連結走」— 而非在抽象的成熟度上表態。三種用法的共同點：RMM 出現在句子裡是為了描述現狀與差異、而非評分。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Level 2 的承諾語意展開：<a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意</a></li>
<li>Level 3 的收益前提交鋒：<a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a></li>
<li>定義權爭奪全景：<a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a></li>
<li>案例原文：<a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a></li>
</ul>
]]></content:encoded></item><item><title>11.C4 Carson Gross：REST 如何變成 REST 的反義詞</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-gross-opposite-of-rest/</guid><description>&lt;p>這個案例的核心責任是把 Fielding 的抽象約束翻成工程史敘事、代表 hypermedia 復興派的論證。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>Gross 重建語意漂移路徑：XML-RPC / SOAP 時代、JSON 取代 XML（但 JSON 是純資料、不是 hypertext）、RMM 普及但業界停在 Level 2、SPA 讓前端與 REST 原則脫鉤、GraphQL 乾脆放棄 REST 名義。結論：今日的 JSON API 是掛 REST 名的 RPC；真正 RESTful 的是 hypermedia-driven 的 HTML 回應。文中同時承認 GraphQL 對 thick-client 場景是合理選擇。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>關鍵教學判準：「REST 的 self-describing 特性是為 uniform client（瀏覽器）設計、machine-to-machine 的 JSON client 用不上」— 這條是復興派與 pragmatic 派唯一共識的觀察、兩派從它推出相反結論、適合當章節的對照樞紐。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>（主案例、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/">How Did REST Come To Mean The Opposite of REST?（htmx essays、Carson Gross）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是把 Fielding 的抽象約束翻成工程史敘事、代表 hypermedia 復興派的論證。</p>
<h2 id="觀察">觀察</h2>
<p>Gross 重建語意漂移路徑：XML-RPC / SOAP 時代、JSON 取代 XML（但 JSON 是純資料、不是 hypertext）、RMM 普及但業界停在 Level 2、SPA 讓前端與 REST 原則脫鉤、GraphQL 乾脆放棄 REST 名義。結論：今日的 JSON API 是掛 REST 名的 RPC；真正 RESTful 的是 hypermedia-driven 的 HTML 回應。文中同時承認 GraphQL 對 thick-client 場景是合理選擇。</p>
<h2 id="判讀">判讀</h2>
<p>關鍵教學判準：「REST 的 self-describing 特性是為 uniform client（瀏覽器）設計、machine-to-machine 的 JSON client 用不上」— 這條是復興派與 pragmatic 派唯一共識的觀察、兩派從它推出相反結論、適合當章節的對照樞紐。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>（主案例、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/">How Did REST Come To Mean The Opposite of REST?（htmx essays、Carson Gross）</a></li>
</ul>
]]></content:encoded></item><item><title>11.C5 htmx HATEOAS essay：透支帳戶的兩種表徵對照</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-htmx-hateoas-html-necessity/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-htmx-hateoas-html-necessity/</guid><description>&lt;p>這個案例的核心責任是提供 HATEOAS 爭論裡最小可教的具體範例。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>essay 用銀行帳戶透支做對照：HTML 回應在透支時只回 deposit 連結 — 業務狀態直接編碼在可用操作裡、client 零業務知識；JSON 回應回 &lt;code>status: &amp;quot;overdrawn&amp;quot;&lt;/code> 欄位、client 必須靠 out-of-band 文件理解語意與下一步 URL。結論主張 HTML 這類 natural hypermedia 是實作 RESTful 系統的 practical necessity、在 JSON 上疊 hypermedia controls 的做法已被業界廣泛拒絕。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>教學判準：「available actions 由誰計算 — server 算完放進 response、還是 client 讀狀態欄位自己算」是 HATEOAS 有無的操作型判別法、比背定義有效。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意&lt;/a>（範例主寫、已引用）、&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>（範例層引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://htmx.org/essays/hateoas/">HATEOAS（htmx essays）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是提供 HATEOAS 爭論裡最小可教的具體範例。</p>
<h2 id="觀察">觀察</h2>
<p>essay 用銀行帳戶透支做對照：HTML 回應在透支時只回 deposit 連結 — 業務狀態直接編碼在可用操作裡、client 零業務知識；JSON 回應回 <code>status: &quot;overdrawn&quot;</code> 欄位、client 必須靠 out-of-band 文件理解語意與下一步 URL。結論主張 HTML 這類 natural hypermedia 是實作 RESTful 系統的 practical necessity、在 JSON 上疊 hypermedia controls 的做法已被業界廣泛拒絕。</p>
<h2 id="判讀">判讀</h2>
<p>教學判準：「available actions 由誰計算 — server 算完放進 response、還是 client 讀狀態欄位自己算」是 HATEOAS 有無的操作型判別法、比背定義有效。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/resource-modeling-operation-semantics/" data-link-title="11.3 資源建模與操作語意" data-link-desc="endpoint 該建模成資源還是動作、HTTP method 與 status 承諾了什麼、available actions 由誰計算 — 建模決策的判準">11.3 資源建模與操作語意</a>（範例主寫、已引用）、<a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>（範例層引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://htmx.org/essays/hateoas/">HATEOAS（htmx essays）</a></li>
</ul>
]]></content:encoded></item><item><title>11.C6 HAL spec：JSON hypermedia 標準化的過期 draft</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-kelly-hal-spec/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-kelly-hal-spec/</guid><description>&lt;p>這個案例的核心責任是記錄「在 JSON 上補 hypermedia」路線的標準化現狀。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>HAL 用 &lt;code>_links&lt;/code> 與 &lt;code>_embedded&lt;/code> 兩個保留屬性在 JSON 上表達 hypermedia controls、目標是讓通用函式庫可以在任何 HAL API 上重用（uniform interface）。狀態：IETF Internet-Draft（最新 v11）、已過期歸檔、無標準地位；生態面曾是 Spring HATEOAS 的預設格式。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>教學判準：「格式碎片化（HAL / Siren / JSON-LD / Collection+JSON 並立、無一勝出）是 hypermedia JSON 未形成 uniform client 的結構性原因」— 這正是 Fielding 說要把力氣花在 media type 上、而業界沒收斂的實證。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>（格式現實段、與 Siren 並列、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://datatracker.ietf.org/doc/html/draft-kelly-json-hal-08">JSON Hypertext Application Language（IETF draft-kelly-json-hal、已過期）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是記錄「在 JSON 上補 hypermedia」路線的標準化現狀。</p>
<h2 id="觀察">觀察</h2>
<p>HAL 用 <code>_links</code> 與 <code>_embedded</code> 兩個保留屬性在 JSON 上表達 hypermedia controls、目標是讓通用函式庫可以在任何 HAL API 上重用（uniform interface）。狀態：IETF Internet-Draft（最新 v11）、已過期歸檔、無標準地位；生態面曾是 Spring HATEOAS 的預設格式。</p>
<h2 id="判讀">判讀</h2>
<p>教學判準：「格式碎片化（HAL / Siren / JSON-LD / Collection+JSON 並立、無一勝出）是 hypermedia JSON 未形成 uniform client 的結構性原因」— 這正是 Fielding 說要把力氣花在 media type 上、而業界沒收斂的實證。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>（格式現實段、與 Siren 並列、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://datatracker.ietf.org/doc/html/draft-kelly-json-hal-08">JSON Hypertext Application Language（IETF draft-kelly-json-hal、已過期）</a></li>
</ul>
]]></content:encoded></item><item><title>11.C7 Siren spec：表達力更完整、採用曲線停滯</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-swiber-siren-adoption/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-swiber-siren-adoption/</guid><description>&lt;p>這個案例的核心責任是跟 HAL 對照、揭露 hypermedia 格式勝出的變數。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>Siren 用 entities / actions / links 三元件表達資源、特點是 first-class 的 &lt;code>actions&lt;/code>（含 method 與欄位、比 HAL 的純連結更接近 HTML form）。採用現狀：約 1.3k stars、最後 release v0.6.2 停在 2017-04、media type &lt;code>application/vnd.siren+json&lt;/code>。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>教學判準：「表達力不是 hypermedia 格式勝出的變數、client 生態才是」— Siren 表達力上更完整（actions 近似 HTML form 的 JSON 化）、採用反而更少。同時支撐 htmx 派「JSON 不是 natural hypermedia」與 pragmatic 派「別等標準收斂」兩邊的決策。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興&lt;/a>（格式現實段、與 HAL 並列、已引用）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/kevinswiber/siren">Siren: a hypermedia specification（Kevin Swiber、GitHub repo）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是跟 HAL 對照、揭露 hypermedia 格式勝出的變數。</p>
<h2 id="觀察">觀察</h2>
<p>Siren 用 entities / actions / links 三元件表達資源、特點是 first-class 的 <code>actions</code>（含 method 與欄位、比 HAL 的純連結更接近 HTML form）。採用現狀：約 1.3k stars、最後 release v0.6.2 停在 2017-04、media type <code>application/vnd.siren+json</code>。</p>
<h2 id="判讀">判讀</h2>
<p>教學判準：「表達力不是 hypermedia 格式勝出的變數、client 生態才是」— Siren 表達力上更完整（actions 近似 HTML form 的 JSON 化）、採用反而更少。同時支撐 htmx 派「JSON 不是 natural hypermedia」與 pragmatic 派「別等標準收斂」兩邊的決策。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 與 HATEOAS 復興</a>（格式現實段、與 HAL 並列、已引用）。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://github.com/kevinswiber/siren">Siren: a hypermedia specification（Kevin Swiber、GitHub repo）</a></li>
</ul>
]]></content:encoded></item><item><title>11.C8 Ben Morris：不做 hypermedia 的 pragmatic REST（反例對照）</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-morris-pragmatic-no-hateoas/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-morris-pragmatic-no-hateoas/</guid><description>&lt;p>這個案例的核心責任是提供 hypermedia 復興派的對照組：pragmatic 派的完整反對論證。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>文章列四條反對論據：client 開發者實務上讀文件直打 endpoint、不會跟連結走（解耦收益落空）；格式無共識、「不會出現資料版的瀏覽器這種 generic REST client」；hypermedia 傳不了資料語意、文件仍不可免；複雜度與 response 膨脹沒有換到等比收益。主張保留 stateless 資源設計的收益、捨 HATEOAS、引 Twitter / Facebook API 為 pragmatic 成功例。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>論證方式是逐條拆 HATEOAS 的收益假設（decoupling、discoverability、evolvability）在 machine-to-machine 場景不成立、而非攻擊名詞。教學判準：「HATEOAS 的收益前提是存在會動態跟連結走的 client — 先問你的 client 是誰、再決定投不投 hypermedia」。與 C4 / C5 形成同觀察、反結論的完整對照。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 復興&lt;/a>（pragmatic 派立場、皆已引用）。反例。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.ben-morris.com/pragmatic-rest-apis-without-hypermedia-and-hateoas/">Pragmatic REST APIs without hypermedia and HATEOAS（Ben Morris）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是提供 hypermedia 復興派的對照組：pragmatic 派的完整反對論證。</p>
<h2 id="觀察">觀察</h2>
<p>文章列四條反對論據：client 開發者實務上讀文件直打 endpoint、不會跟連結走（解耦收益落空）；格式無共識、「不會出現資料版的瀏覽器這種 generic REST client」；hypermedia 傳不了資料語意、文件仍不可免；複雜度與 response 膨脹沒有換到等比收益。主張保留 stateless 資源設計的收益、捨 HATEOAS、引 Twitter / Facebook API 為 pragmatic 成功例。</p>
<h2 id="判讀">判讀</h2>
<p>論證方式是逐條拆 HATEOAS 的收益假設（decoupling、discoverability、evolvability）在 machine-to-machine 場景不成立、而非攻擊名詞。教學判準：「HATEOAS 的收益前提是存在會動態跟連結走的 client — 先問你的 client 是誰、再決定投不投 hypermedia」。與 C4 / C5 形成同觀察、反結論的完整對照。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a> 與 <a href="/blog/backend/11-api-design/styles/rest/hypermedia-hateoas-revival/" data-link-title="Hypermedia 與 HATEOAS 復興" data-link-desc="復興派的論證本體：uniform client 前提、語意漂移史、格式標準化的失敗現實、反方的收益假設拆解 — 與 hypermedia 的適用邊界">Hypermedia 復興</a>（pragmatic 派立場、皆已引用）。反例。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://www.ben-morris.com/pragmatic-rest-apis-without-hypermedia-and-hateoas/">Pragmatic REST APIs without hypermedia and HATEOAS（Ben Morris）</a></li>
</ul>
]]></content:encoded></item><item><title>11.C9 twobithistory：被挪用的 REST 論文（史觀對照）</title><link>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-twobithistory-misappropriation/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/11-api-design/cases/rest-twobithistory-misappropriation/</guid><description>&lt;p>這個案例的核心責任是給「語意學之爭」提供兩派之外的第三方史觀。二手來源、引用時標明。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>考據指出：Fielding 論文寫於 2000、談的是 HTTP/1.1 的設計理據而非 API 建構（當時 web API 尚不存在）；業界在棄 SOAP 時需要學術正當性、把 pragmatic HTTP 用法掛上 REST 名字；Rails 2007 移除 SOAP 支援是轉折符號。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;p>史觀的教學價值是中立定調：兩派都沒有冤枉對方 — 名字確實被挪用、但挪用後的東西自成合理架構。適合當「REST 語意學之爭」章節收尾的第三方視角、避免章節被迫選邊。&lt;/p>
&lt;h2 id="對應大綱">對應大綱&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭&lt;/a>（收尾史觀段、已引用）。二手來源、標明性質後使用。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;p>回 &lt;a href="https://tarrragon.github.io/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫&lt;/a>。&lt;/p>
&lt;h2 id="引用源">引用源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://twobithistory.org/2020/06/28/rest.html">Roy Fielding&amp;rsquo;s Misappropriated REST Dissertation（Two-Bit History、2020）&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>這個案例的核心責任是給「語意學之爭」提供兩派之外的第三方史觀。二手來源、引用時標明。</p>
<h2 id="觀察">觀察</h2>
<p>考據指出：Fielding 論文寫於 2000、談的是 HTTP/1.1 的設計理據而非 API 建構（當時 web API 尚不存在）；業界在棄 SOAP 時需要學術正當性、把 pragmatic HTTP 用法掛上 REST 名字；Rails 2007 移除 SOAP 支援是轉折符號。</p>
<h2 id="判讀">判讀</h2>
<p>史觀的教學價值是中立定調：兩派都沒有冤枉對方 — 名字確實被挪用、但挪用後的東西自成合理架構。適合當「REST 語意學之爭」章節收尾的第三方視角、避免章節被迫選邊。</p>
<h2 id="對應大綱">對應大綱</h2>
<p><a href="/blog/backend/11-api-design/styles/rest/rest-semantics-dispute/" data-link-title="REST 語意學之爭：一個詞的定義權爭奪" data-link-desc="Fielding 原義、業界 JSON-over-HTTP 慣行、第三方史觀三方的完整論證 — 以及這場命名之爭對工程溝通的實際影響">REST 語意學之爭</a>（收尾史觀段、已引用）。二手來源、標明性質後使用。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>回 <a href="/blog/backend/11-api-design/cases/" data-link-title="模組十一案例庫：API 設計與對外契約" data-link-desc="API 風格流派、版本與相容、介面語意、規範治理的已驗證公開案例集；含反例與覆蓋缺口標明">模組十一案例庫</a>。</p>
<h2 id="引用源">引用源</h2>
<ul>
<li><a href="https://twobithistory.org/2020/06/28/rest.html">Roy Fielding&rsquo;s Misappropriated REST Dissertation（Two-Bit History、2020）</a></li>
</ul>
]]></content:encoded></item></channel></rss>