獲取數據的WP REST API

在本系列的前面部分中,我們一直在研究什么是 wp rest api 以及它如何幫助我們使用 wordpress 后端構建更好的應用程序。

然后,我們研究了在服務器上設置身份驗證以生成經過身份驗證的請求的兩種不同方法。第一種是基本身份驗證方法,它在開發環境中很有用,并且允許快速原型設計,因為它不需要太多時間來設置。高級身份驗證方法是 OAuth 2.0,推薦用于生產環境,因為它比基本身份驗證方法安全得多。

現在我們已經了解了如何設置身份驗證,我們準備生成經過身份驗證的請求以釋放 WP REST API 的全部功能。由于其易于使用,我們將在本系列中使用基本身份驗證,但建議您為生產服務器使用 OAuth 2.0 身份驗證(由 WordPress REST API 身份驗證插件提供)。

WordPress REST API 身份驗證插件通過添加身份驗證機制來控制對 API 端點的訪問,從而增強了 WordPress REST API 的安全性。它帶有一些身份驗證方法:

  • 基本身份驗證
  • API 密鑰身份驗證
  • JWT 身份驗證
  • OAuth 2.0 身份驗證

設置身份驗證后,您可以為不同的 API 端點定義訪問控制規則。它允許您配置哪些用戶或角色有權訪問特定端點。它還提供了根據用戶角色、能力或特定用戶 ID 限制訪問的選項。

在本系列的當前部分中,我們將首次親身體驗 WP REST API。我們將:

  • 分析 GET 請求的結構
  • 查看 OPTIONS 請求如何自行記錄 API
  • 向服務器發送請求以檢索數據
  • 分析包括屬性、架構和鏈接的服務器響應
  • GET 請求剖析
  • 使用 OPTIONS 請求在 API 中導航
  • 處理帖子
  • 使用帖子修訂、類別和標簽
  • 使用其他資源

因此,我們首先分析一個簡單的 GET 請求的結構。

GET 請求剖析

在深入研究使用 WP REST API 檢索任何數據的詳細信息之前,我們需要熟悉發送到服務器的請求的語法。這將為我們將來與 WP REST API 的交互奠定堅實的基礎。

考慮發送到服務器的以下請求:

$GET https://localserver/wp-json/wp/v2/posts 

我們發送的請求類型是 GET — 我們在本系列的第一部分中介紹的六個 HTTP 動詞之一。 GET 請求用于從服務器檢索數據。因此,當在服務器上執行時,上述請求會以 JSON 數據的形式檢索所有 post 對象的集合。

考慮到請求 URI,我們可以將其分為以下部分:

  • https://localserver/:我的本地開發服務器的 URL。它可以是任何 URL,具體取決于您的 WordPress 安裝位置。
  • /wp-json:WP REST API 的端點前綴。
  • /wp:WP REST API 的命名空間。
  • /v2:WP REST API 的版本。
  • /posts:這是我們要從服務器檢索的資源。

命名空間可防止運行多個插件時可能發生的覆蓋,每個插件都為 RESTful API 提供自己的抽象層。因此,每個抽象都在自己的邊界內工作,不會影響屬于其他抽象的方法和屬性。

除了使用上述 URI 檢索資源(帖子)集合之外,我們還可以通過提及其 ID 來檢索特定資源:

$GET /wp/v2/posts/100 

上面的請求將返回一個 post 對象,因為它向下查找 ID 為 100 的 post 資源。

通常,我們還需要搜索符合某些特定條件的帖子。例如,您可以按類別過濾帖子,如以下代碼片段所示。

$ GET /wp/v2/posts?categories=20,30 

通過發送上述請求,我們可以檢索屬于 ID 20 和 30 的類別的所有帖子。如您所見,您可以在 categories 參數中傳遞一個或多個類別 ID,它應該返回帖子在類別分類中分配特定術語。

上述語法相當于以下 WP_Query() 調用:

<?php $query = new WP_Query( array(     'tax_query' => array(         array(             'taxonomy' =&gt; 'category',             'field'    =&gt; 'term_id',             'terms'    =&gt; array( 20, 30 ),         ),     ), ) ); 

因此,上述 GET 請求將檢索屬于 ID 為 20 和 30 的兩個類別的帖子列表。相同的語法也可用于具有兩個以上元素的數組參數.

現在我們已經了解了如何格式化 GET 請求并提供其參數,是時候看看 OPTIONS 請求了。 OPTIONS 請求可以輕松地瀏覽 API,并且實際上可以作為一種自記錄方式,通過記錄端點上所有可用的 HTTP 方法以及參數來使 API 更易于訪問他們支持。

使用 OPTIONS 請求在 API 中導航

如前所述,OPTIONS 請求對于探索 API 非常有幫助。它提到了屬于某個路由的所有端點,并提供了這些端點支持 CRUD 操作的參數列表。

讓我們向 /wp/v2/posts 路由發送 OPTIONS 請求,以檢查它支持哪些端點以及我們可以沿 GET請求查詢數據:

$curl -X OPTIONS /wp/v2/posts 

我使用curl發送上述請求,但您可以使用您選擇的任何工具,包括Postman。請務必包含上述路由的完整路徑,包括您的服務器的路徑。

{     "namespace": "wp/v2",     "methods": [...],     "endpoints": [...],     "schema": {...},     "_links": {...} } 

上面的 OPTIONS 請求 /wp/v2/posts 路由返回 JSON 格式的數據,其中包含五個屬性:

  • 命名空間
  • 方法
  • 端點
  • schema
  • _links
{     "namespace": "wp/v2",     .... } 

namespace 屬性標識當前插件的命名空間。在我們的例子中,它是 wp/v2,表示 WP REST API 的版本 2。我們已經在上一節中了解了命名空間及其服務的用途。

{     ...     "methods": [         "GET",         "POST"     ],     ... } 

methods 屬性包含當前路由支持的所有方法的數組。通過查看上述請求返回的響應,可以清楚地看到 /wp/v2/posts 路由支持兩種方法,即 GET 和 POST 。這意味著我們可以使用 /wp/v2/posts 路由來檢索帖子,以及創建新帖子。我們將在本系列的下一部分中處理 POST 方法,因此我們暫時只關注 GET 方法。

下一個屬性 — endpoints — 包含當前路由支持的端點數組。此屬性直接鏈接到前面提到的 methods 屬性,因為它列出了支持的方法的端點。

{     ...     "endpoints": [         {             "methods": [                 "GET"             ],             "args": {...},             "allow_batch": {"v1":true}         },         {             "methods": [                 "POST"             ],             "args": {...},             "allow_batch": {"v1":true}         }     ],     ... } 

endpoints 屬性包含對象值,而對象值又包含三個屬性,即 methods、args 和 allow_batch。 methods 屬性包含 HTTP 方法的數組,下一個 args 屬性包含這些方法支持的所有參數。最后,allow_batch 屬性用于了解端點是否支持批量請求功能。這些是我們以 URI 參數的形式隨請求發送的參數。

查看 GET 方法支持的參數,我們發現了 20 多個參數,包括 context、page、 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:javascript;toolbal:false;">&quot;methods&quot;: [ &quot;GET&quot; ], &quot;args&quot;: { &quot;context&quot;: { &quot;required&quot;: false, &quot;default&quot;: &quot;view&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;Scope under which the request is made; determines fields present in response.&quot; }, &quot;page&quot;: { &quot;required&quot;: false, &quot;default&quot;: 1, &quot;type&quot;: &quot;integer&quot;, &quot;description&quot;: &quot;Current page of the collection.&quot;, &quot;minimum&quot;: &quot;1&quot; }, &quot;per_page&quot;: { &quot;required&quot;: false, &quot;default&quot;: 1, &quot;type&quot;: &quot;integer&quot;, &quot;description&quot;: &quot;Maximum number of items to be returned in result set.&quot;, &quot;minimum&quot;: &quot;1&quot;, &quot;maximum&quot;: &quot;100&quot; }, } </pre><div class="contentsignin"></div></div> <p>返回的響應中的 schema 屬性記錄了當前資源的所有屬性。該架構定義了 JSON 格式的數據結構。 WP REST API 中使用的架構格式基于 JSON 架構規范草案 4。</p> <p>最后一個 _links 屬性包含一個對象數組,其中包含關聯資源的鏈接。對象中的鍵指定關系類型(例如 author、collection、self、comments 等) ,其值是指向相關資源的鏈接。該鏈接標準基于 HAL(超文本應用語言)。您可以通過閱讀 Mike Kelley 撰寫的規范來了解有關 HAL 的更多信息。</p> <p>以類似的方式,我們也可以向其他路由(包括用戶、評論、媒體、頁面等)發送 OPTIONS 請求,以檢查其支持的方法和參數。 OPTIONS?請求是您使用 WP REST API 時最好的朋友。</p> <p>WP REST API 提供了另一種評估 API 可用性的方法,即向 /wp-json 索引路由發送 GET 請求。這將列出所有路由及其端點及其支持的方法和參數。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:shell;toolbal:false;">$curl -X GET http://wordpress-server/wp-json </pre><div class="contentsignin"></div></div> <p>上述請求將返回一個包含路由屬性的響應對象,如下所示:</p> <p><img src="https://img.php.cn/upload/article/000/000/164/169380750312779.jpg" alt="獲取數據的WP REST API"></p> <p>此功能非常強大,因為它列出了所有路由及其支持的方法和參數,因此無需在外部記錄所有這些內容。當我們對不同的資源執行CRUD操作時,我們將引用這個響應對象。</p> <p>查看了探索 API 的選項后,現在讓我們開始使用 WP REST API 從服務器檢索數據。</p> <h2 id="toc-snaf-working-with-posts">處理帖子</h2> <p>到目前為止,我們已經熟悉了 OPTIONS 請求,這是一種評估 API 可用性的自記錄方式。我們還研究了它如何顯示給定路由支持的方法和參數。利用這些知識,我們現在準備使用 WP REST API 從服務器檢索不同的資源。</p> <p>我們將從 <em>posts</em> 資源開始,因為它是 WordPress 的主要構建塊。我們將使用不同的標準來檢索帖子。通過應用這些知識,您將能夠使用 WP REST API 查詢帖子,就像使用 WP_Query 類一樣。</p> <p>在本系列中,我們一直在使用 <em>posts</em> 資源來演示示例請求及其響應,并且我們已經知道如何通過 ID 檢索帖子集合和單個帖子。所以我們不會再討論這個了。相反,我們將研究一些使用頂級參數檢索帖子的更高級方法。</p> <h3 id="toc-ou7g-working-with-top-level-parameters">使用頂級參數</h3> <p>WP REST API 直接在 GET 端點上公開一些最常用的帖子查詢變量。這些參數是:</p> <table> <thead><tr> <th>參數</th> <th>含義</th> </tr></thead> <tbody> <tr> <td><strong>context</strong></td> <td>請求的范圍??赡艿闹悼梢允?view、embed 或 edit。默認為view。</td> </tr> <tr> <td><strong>page</strong></td> <td>帖子集合的當前頁面。默認為 1。</td> </tr> <tr> <td><strong>per_page</strong></td> <td>每頁帖子總數。默認為 10。</td> </tr> <tr> <td><strong>搜索</strong></td> <td>搜索查詢。將結果限制為匹配字符串。</td> </tr> <tr> <td><strong>after</strong></td> <td>僅返回在此參數中指定的日期之后發布的帖子。</td> </tr> <tr> <td><strong>modified_after</strong></td> <td>僅返回在此參數中指定的日期之后修改的帖子。</td> </tr> <tr> <td><strong>作者</strong></td> <td>作者 ID。用于限制屬于特定作者的結果。</td> </tr> <tr> <td><strong>author_exclude</strong></td> <td>結果集不包括分配給特定作者的帖子。</td> </tr> <tr> <td><strong>之前</strong></td> <td>僅返回在此參數中指定的日期之前發布的帖子。</td> </tr> <tr> <td><strong>modified_before</strong></td> <td>僅返回在此參數中指定的日期之前修改的帖子。</td> </tr> <tr> <td><strong>排除</strong></td> <td>要從搜索結果中排除的帖子 ID 數組。</td> </tr> <tr> <td><strong>include</strong></td> <td>將結果限制為此數組中指定的帖子 ID。</td> </tr> <tr> <td><strong>offset</strong></td> <td>將搜索結果偏移指定的數字。</td> </tr> <tr> <td><strong>order</strong></td> <td>集合的順序??梢允?asc 或 desc。</td> </tr> <tr> <td><strong>orderby</strong></td> <td>集合的排序屬性??赡艿闹悼梢允?author, date, id, include, modified, parent, relevance, slug 、include_slugs 和 title。</td> </tr> <tr> <td><strong>search_columns</strong></td> <td>您可以指定要搜索的列名數組。</td> </tr> <tr> <td><strong>slug</strong></td> <td>將結果限制為具有特定 slug 的帖子。</td> </tr> <tr> <td><strong>status</strong></td> <td>用于限制具有特定狀態的帖子的收集。</td> </tr> <tr> <td><strong>tax_relation</strong></td> <td>用于根據多個分類法之間的關系來限制結果集。</td> </tr> <tr> <td><strong>類別</strong></td> <td>按類別分類中分配的術語過濾結果集。</td> </tr> <tr> <td><strong>categories_exclude</strong></td> <td>將結果集過濾為除類別分類中指定的特定術語之外的項目。</td> </tr> <tr> <td><strong>標簽</strong></td> <td>按標簽分類中指定的術語過濾結果集。</td> </tr> <tr> <td><strong>tags_exclude</strong></td> <td>將結果集過濾為除標簽分類中指定的特定術語之外的項目。</td> </tr> <tr> <td><strong>sticky</strong></td> <td>用于將結果集限制為粘性項目。</td> </tr> </tbody> </table> <p>context 參數用于根據我們正在工作的范圍獲取帖子。如果我們只是在索引頁面上列出帖子,那么我們可以使用 view 上下文。但是,如果我們要檢索帖子以進行編輯,則需要使用 edit 上下文:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbal:false;">$GET /wp/v2/posts?context=edit </pre><div class="contentsignin"></div></div> <p>edit 上下文參數在 title、content 和 <code raw>摘錄。這個 raw 字段的值可以在編輯器中回顯出來,用于編輯內容。

獲取數據的WP REST API

使用 edit 上下文需要您作為具有 edit_posts 權限的用戶進行身份驗證。

使用 embed 作為 context 參數的值可獲取帖子的集合及其屬性的最小子集。

上面提到的其他參數非常不言自明,您可以在 HTTP 客戶端中使用它們。

這些是允許您根據特定條件查詢帖子的基本參數。

如何使用其他條件過濾記錄

除了使用一些基本的頂級參數檢索帖子集合之外,WP REST API 還允許您按各種其他條件過濾記錄。通過使用此語法,我們可以像使用 WP_Query() 類一樣查詢帖子。

分頁參數是所有過濾器中最重要的,因為它們在帖子列表頁面上廣泛使用。分頁參數允許我們在每頁顯示特定數量的帖子,并導航到包含帖子的特定數量的頁面。

默認情況下,GET 請求會檢索每頁 10 個帖子的集合。讓我們看看如何提交 GET 請求來檢索每頁僅五個帖子:

$GET /wp/v2/posts?per_page=5 

上述請求使用 per_page 變量,如果您使用過 WP_Query(),您可能會熟悉該變量。

page 參數與 per_page 參數結合使用,用于導航到特定數量的頁面。每頁檢索到五個帖子后,我們將發出以下請求以導航到第二頁:

$GET /wp/v2/posts?per_page=5&amp;page=2 

在使用 WP REST API 在列表頁面上構建分頁時,per_page 和 page 過濾器非常方便。

除了上述請求返回的帖子集合之外,服務器還返回許多標頭以及包含有用信息的響應,包括帖子總數和頁數。這些值包含在 X-WP-TotalPages 和 X-WP-Total 響應標頭中。

獲取數據的WP REST API

使用 WP REST API 創建分頁時,X-WP-TotalPages 和 X-WP-Total 響應標頭非常有用,因為它們列出了頁面總數以及帖子總數。

除了分頁過濾器之外,您還可以按日期過濾帖子。

因此,如果我們要查找日期為 2015-10-15(yyyy/mm/dd)發布的帖子,可以通過以下查詢來實現:

$ GET /wp/v2/posts?modified_after=2015-10-14&amp;modified_before=2015-10-16 

我們已經在本教程的上一節中了解了如何使用 categories 參數獲取屬于特定類別或多個類別的帖子。讓我們看看如何顯示屬于 id 為 5 和 6 的類別的帖子:

$ GET /wp/v2/posts?categories=5,6 

上述請求將檢索屬于 ID 為 5 和 6 的類別的所有帖子的列表。

通過以下方式使用 categories_exclude 參數可以達到相反的效果:

$ GET /wp/v2/posts?categories_exclude=5,6 

這將檢索帖子列表,同時排除屬于 ID 為 5 或 6 的類別的所有帖子。

現在我們已經在 WP REST API 的幫助下查看了查詢帖子時的不同選項,我們準備進一步推進我們的旅程并查看 WP REST API 支持的一些其他資源。

使用帖子修訂、類別和標簽

帖子修訂提供了一種查看和恢復對帖子所做編輯的方法。 WP REST API 提供了一種通過查詢 /posts//revisions 端點來查看帖子的所有修訂版本的方法。因此,對于 ID 為 10 的給定帖子,可以通過發送以下請求來檢索所有修訂:

$ GET /wp/v2/posts/10/revisions 

上述請求將返回一個包含修訂對象的數組。修訂對象包含在發布對象中找到的屬性的子集。下面是 Postman 中的修訂對象示例:

獲取數據的WP REST API

只要我們知道其 ID,就可以檢索特定的修訂版本。因此,可以通過以下對象檢索 ID 為 10 的帖子上 ID 為 2 的修訂:

$ GET /wp/v2/posts/10/revisions/2 

上述請求將返回單個修訂對象。

除了帖子修訂之外,還可以通過以下請求檢索特定帖子的類別:

$ GET /wp/v2/categories?post=<post_id></post_id>

對于標簽,我們使用以下請求,其中 是帖子的 ID:

$ GET /wp/v2/tags?post=<post_id></post_id>

如果我們需要檢索 ID 為 10 的帖子的帖子元數據,我們將以經過身份驗證的用戶身份發送以下請求:

$ GET /wp/v2/posts/10/meta 

這將返回一個元對象數組。

請注意,要在 WP REST API 中使用帖子和頁面元,您需要安裝配套插件,該插件可從 WP REST API 團隊在 GitHub 上獲取。

使用其他資源

到目前為止,我們已經為使用 WP REST API 檢索數據奠定了相當堅實的基礎。我們已經研究了選項請求以及它如何幫助我們在不需要外部文檔的情況下探索 API。

您始終可以向特定資源發送 OPTIONS 請求,并檢查它支持哪些端點和參數。如果您需要列出 WP REST API 提供的所有路由,您可以向 /wp-json 處的索引端點發送 GET 請求,正如我們在本教程的開始。

考慮到自我文檔的優勢,我認為我們不需要進一步探索本教程中的每個單獨資源,因為您現在可以自己完成此操作。

接下來會發生什么?

在這個冗長的教程中,我們學習了使用 OPTIONS 請求探索 API 并使用 WP REST API 從服務器檢索數據。我們只查看了一些資源,包括帖子、修訂后和帖子元,因為我們無法僅在一個教程中涵蓋所有支持的資源。但您現在應該能夠使用我們在本教程中介紹的技術自行探索 API。

WordPress 的經濟非?;钴S。有主題、插件、庫和許多其他產品可以幫助您構建網站和項目。該平臺的開源性質也使其成為提高編程技能的絕佳選擇。

在本系列的下一部分中,我們將學習執行 CRUD 的其他三個操作,即創建、更新和刪除資源。所以請繼續關注。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享