##介紹
HTTP代表超文本傳輸協議,是整個互聯網的基礎通信協議。 即使這是您第一次使用HTTP的經歷,也許您可能比了解更多。 在最基本的層面上,HTTP的工作原理如下:
- “你好,服務器XYZ,請問我有文件abc.html”
- “好,你好,有一點客戶,是的,你可能,這里是”
在PHP中發送HTTP請求有許多不同的方法。 WordPress HTTP API的目的是支持盡可能多的這些方法,并使用最適合特定請求的方法。
WordPress HTTP API也可用于與Twitter API或Google Maps API等其他API進行通信和交互。
## HTTP方法
HTTP有幾種描述特定類型操作的方法或動詞。 雖然還有幾個存在,WordPress已經預先建立了三個最常見的功能。 每當HTTP請求被發送時,也會傳遞一個方法來幫助服務器確定客戶端請求哪種動作。
## GET
GET用于檢索數據。 這是迄今為止最常用的動詞。 每次您查看網站或從API中提取數據時,都會看到GET請求的結果。 實際上,您的瀏覽器向您正在閱讀的服務器發送GET請求,并請求用于構建此文章的數據。
## POST
POST用于向服務器發送數據,以使服務器以某種方式進行操作。 例如,聯系表。 當您在表單域中輸入數據并單擊提交按鈕時,瀏覽器將收集數據,并將POST請求發送到服務器,并將其輸入到表單中。 從那里,服務器將處理聯系請求。
## HEAD
HEAD不如其他兩個人所熟知。 HEAD與GET請求基本相同,除了它不檢索數據,只有關于數據的信息。 此數據描述了上次更新數據時,客戶端是否應緩存數據,數據類型等。現代瀏覽器通常會將HEAD請求發送到先前訪問過的頁面,以確定是否有更新。 如果沒有,您實際上可能會看到以前下載的頁面副本,而不是使用帶寬不必要地拉入同一個副本。
所有良好的API客戶端在執行GET請求之前可以利用HEAD來潛在地節省帶寬。 盡管如果HEAD表示有新數據,則需要兩個單獨的HTTP請求,具有GET請求的數據大小可能非常大。 當HEAD表示數據是新的或不應該被緩存時,只使用GET將有助于節省昂貴的帶寬和加載時間。
## 自定義方法
還有其他HTTP方法,如PUT,DELETE,TRACE和CONNECT。 這些方法將不在本文中,因為沒有預先構建的方法來在WordPress中使用它們,也不是API實現它們的常見方法。
根據您的服務器配置方式,您還可以實現您自己的其他HTTP方法。 總是冒險超越標準的方法,并為其他開發者創造客戶端以消耗您的網站或API的巨大潛在限制,但是可以利用WordPress中的任何方法。 我們將在本文中簡要介紹一下如何做到這一點。
## 響應碼
HTTP使用數字和字符串響應代碼。 而不是對每個的冗長解釋,這里是標準響應代碼。 您可以在創建API時定義自己的響應代碼,但是除非您需要支持特定類型的響應,否則最好遵守標準代碼。 自定義代碼通常在1xx范圍內。
## 代碼類
三位數代碼的最左邊的數字可以快速看到響應類型。
|狀態碼|說明|
|---|---|
|2xx|請求成功|
|3xx|請求被重定向到另一個URL|
|4xx|由于客戶端錯誤請求失敗。 通常無效的認證或丟失的數據|
|5xx|由于服務器錯誤而請求失敗。 常常丟失或配置錯誤的配置文件|
## 通用代碼
這些是您將遇到的最常見的代碼。
|狀態碼|說明|
|---|---|
|200| OK - 請求成功|
|301|資源永久移動|
|302|資源暫時移動|
|403|禁止 - 通常是由于認證無效|
|404|資源未找到|
|500|內部服務器錯誤|
|503|服務不可用|
## 從API獲取數據
GitHub提供了一個優秀的API,它不需要許多公共方面的應用程序注冊,因此要演示其中的一些方法,示例將針對GitHub API。
通過wp_remote_get()函數在WordPress中獲取數據非常簡單。此函數具有以下兩個參數:
- $url – 從中檢索數據的資源。 這必須是標準的HTTP格式
- $args – 可選 - 您可以在此處傳遞一組參數來更改行為和標題,例如Cookie,跟隨重定向等。
假定以下默認值,盡管可以通過$args參數更改它們:
- method – GET
- timeout – 5 – 放棄之前等待多久
- redirection – 5 – 多少次遵循重定向。
- httpversion – 1.0
- blocking – true – 頁面的其余部分是否等待完成加載,直到此操作完成?
- headers – array()
- body – null
- cookies – array()
讓我們使用一個GitHub用戶帳戶的URL,看看我們可以得到什么樣的信息
```
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
```
$response將包含有關我們的請求的所有標題,內容和其他元數據
```
Array
(
[headers] => Array
(
[server] => nginx
[date] => Fri, 05 Oct 2012 04:43:50 GMT
[content-type] => application/json; charset=utf-8
[connection] => close
[status] => 200 OK
[vary] => Accept
[x-ratelimit-remaining] => 4988
[content-length] => 594
[last-modified] => Fri, 05 Oct 2012 04:39:58 GMT
[etag] => "5d5e6f7a09462d6a2b473fb616a26d2a"
[x-github-media-type] => github.beta
[cache-control] => public, s-maxage=60, max-age=60
[x-content-type-options] => nosniff
[x-ratelimit-limit] => 5000
)
[body] => {"type":"User","login":"blobaugh","gravatar_id":"f25f324a47a1efdf7a745e0b2e3c878f","public_gists":1,"followers":22,"created_at":"2011-05-23T21:38:50Z","public_repos":31,"email":"ben@lobaugh.net","hireable":true,"blog":"http://ben.lobaugh.net","bio":null,"following":30,"name":"Ben Lobaugh","company":null,"avatar_url":"https://secure.gravatar.com/avatar/f25f324a47a1efdf7a745e0b2e3c878f?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","id":806179,"html_url":"https://github.com/blobaugh","location":null,"url":"https://api.github.com/users/blobaugh"}
[response] => Array
(
[preserved_text 5237511b45884ac6db1ff9d7e407f225 /] => 200
[message] => OK
)
[cookies] => Array
(
)
[filename] =>
)
```
所有相同的助手功能都可以與前兩個功能一樣使用。 這里的例外是HEAD永遠不會返回一個body,因此元素將始終為空。
## 獲得你一直想要的身體
只要身體可以使用wp_remote_retrieve_body()檢索。 此函數只需要一個參數,來自其他檢索的其他wp_remote_X函數的響應不是下一個值。
```
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
$body = wp_remote_retrieve_body( $response );
```
仍然使用前面的例子中的GitHub資源,$body將會
```
{"type":"User","login":"blobaugh","public_repos":31,"gravatar_id":"f25f324a47a1efdf7a745e0b2e3c878f","followers":22,"avatar_url":"https://secure.gravatar.com/avatar/f25f324a47a1efdf7a745e0b2e3c878f?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png","public_gists":1,"created_at":"2011-05-23T21:38:50Z","email":"ben@lobaugh.net","following":30,"name":"Ben Lobaugh","company":null,"hireable":true,"id":806179,"html_url":"https://github.com/blobaugh","blog":"http://ben.lobaugh.net","location":null,"bio":null,"url":"https://api.github.com/users/blobaugh"}
```
如果您沒有任何其他操作來執行響應,除了獲得身體,您可以將代碼減少到一行
```
$body = wp_remote_retrieve_body( wp_remote_get( 'https://api.github.com/users/blobaugh' ) );
```
這些幫助函數中的許多功能也可以在一行上同樣使用。
## 獲取響應代碼
您可能需要檢查響應代碼,以確保檢索成功。 這可以通過wp_remote_retrieve_response_code()函數完成:
```
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
$http_code = wp_remote_retrieve_response_code( $response );
```
如果成功$http_code將包含200。
## 獲取一個特定的頭文件
如果你想要檢索一個特定的標題,比如說最后一次修改,你可以用wp_remote_retrieve_header()這樣做。 此功能需要兩個參數
- $response - 獲取調用的響應
- $header - 要檢索的頭的名稱
檢索最后修改的標題
```
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
$last_modified = wp_remote_retrieve_header( $response, 'last-modified' );
```
$ last_modified 將包含[last-modified] => Fri,05 Oct 2012 04:39:58 GMT
您還可以使用wp_remote_retrieve_headers($ response)檢索數組中的所有頭。
## GET使用基本認證
受保護的API提供了許多不同類型的身份驗證中的一種或多種。 HTTP基本身份驗證是一種常見的,但不是非常安全的身份驗證方法。 通過將“授權”傳遞給wp_remote_get()函數的第二個參數以及其他HTTP方法函數,可以在WordPress中使用。
```
$args = array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( YOUR_USERNAME . ':' . YOUR_PASSWORD )
)
);
wp_remote_get( $url, $args );
```
## 將數據發布到API
相同的幫助方法(wp_remote_retrieve_body()等)可用于所有HTTP方法調用,并以相同的方式使用。
POST數據使用wp_remote_post()函數完成,并且與wp_remote_get()完全相同的參數。這里應該注意的是,您需要傳遞第二個參數的數組中的所有元素。食典提供默認的可接受值。您只需要關心發送的數據,所以其他值將被默認。
要將數據發送到服務器,您將需要構建一個關聯的數據數組。該數據將被分配給“body”值。從服務器端的值將會出現在$ _POST變量中。即如果在服務器$ _POST ['myvar'] = 5上的body => array('myvar'=> 5)。
因為GitHub不允許POST到上一個例子中使用的API,這個例子將假裝它是這樣的。通常,如果要將數據POST到API,您需要聯系API的維護者并獲取API密鑰或某種其他形式的身份驗證令牌。這只是證明您的應用程序被允許以與用戶對網站登錄網站相同的方式操縱API上的數據。
假設我們提交的聯系表單包含以下字段:姓名,電子郵件,主題,評論。要設置身體,我們執行以下操作:
```
$body = array(
'name' => 'Jane Smith',
'email' => 'some@email.com',
'subject' => 'Checkout this API stuff',
'comment' => 'I just read a great tutorial by this Ben Lobaugh. It taught me amazing things about interacting with APIs in WordPress! You gotta check it out!'
);
```
現在我們需要設置將被傳遞給wp_remote_post()的第二個參數的其余值,
```
$args = array(
'body' => $body,
'timeout' => '5',
'redirection' => '5',
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'cookies' => array()
);
```
那么當然要打電話
```
$response = wp_remote_post( 'http://your-contact-form.com', $args );
```
對于那些不喜歡拼接在一起這里代碼的人,整個片段
```
$body = array(
'name' => 'Jane Smith',
'email' => 'some@email.com',
'subject' => 'Checkout this API stuff',
'comment' => 'I just read a great tutorial by this Ben Lobaugh. It taught me amazing things about interacting with APIs in WordPress! You gotta check it out!'
);
$args = array(
'body' => $body,
'timeout' => '5',
'redirection' => '5',
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'cookies' => array()
);
$response = wp_remote_post( 'http://your-contact-form.com', $args );
```
## HEADING關閉帶寬使用
API可能非常重要,有時候需要使用HEAD檢查資源狀態。在高流量API上,GET通常限于每分鐘或小時的請求數。除非HEAD請求顯示API上的數據已更新,否則不需要嘗試GET請求。
如前所述,HEAD包含有關數據是否已被更新的數據,如果數據應該被緩存,何時到期緩存的副本,以及有時對API的請求的速率限制。
回到GitHub示例,這里有幾個標題要注意。大多數這些標頭是標準的,但是您應該始終檢查API文檔,以確保您了解哪些頭命名為什么以及其目的。
- x-ratelimit-limit - 一段時間內允許的請求數
- x-ratelimit-remaining - 在時間段內剩余的可用請求數
- content-length - 內容以字節為單位。如果內容相當大,警告用戶可能很有用
- last-modified - 資源上次修改時。對緩存工具非常有用
- cache-control - 客戶端應如何處理緩存
以下將檢查我的GitHub用戶帳戶的HEAD值:
```
$response = wp_remote_head( 'https://api.github.com/users/blobaugh' );
```
$response應該看起來類似
```
Array
(
[headers] => Array
(
[server] => nginx
[date] => Fri, 05 Oct 2012 05:21:26 GMT
[content-type] => application/json; charset=utf-8
[connection] => close
[status] => 200 OK
[vary] => Accept
[x-ratelimit-remaining] => 4982
[content-length] => 594
[last-modified] => Fri, 05 Oct 2012 04:39:58 GMT
[etag] => "5d5e6f7a09462d6a2b473fb616a26d2a"
[x-github-media-type] => github.beta
[cache-control] => public, s-maxage=60, max-age=60
[x-content-type-options] => nosniff
[x-ratelimit-limit] => 5000
)
[body] =>
[response] => Array
(
[preserved_text 39a8515bd2dce2aa06ee8a2a6656b1de /] => 200
[message] => OK
)
[cookies] => Array
(
)
[filename] =>
)
```
所有相同的助手功能都可以與前兩個功能一樣使用。 這里的例外是HEAD永遠不會返回一個body,因此元素將始終為空。
## 做任何形式的請求
如果您需要使用上述功能不支持的HTTP方法發出請求,請不要驚慌。 發展WordPress的偉大人物已經想到了,并且親切地提供了wp_remote_request()。 此函數使用與wp_remote_get()相同的兩個參數,并允許您同時指定HTTP方法。 您需要傳遞哪些數據取決于您的方法。
要發送DELETE方法示例,您可能有以下類似的內容:
```
$args = array(
'method' => 'DELETE'
);
$response = wp_remote_request( 'http://some-api.com/object/to/delete', $args );
```
## 緩存介紹
緩存是一種習慣,通常需要大量時間構建的對象或對象被保存到快速對象存儲中,以便稍后的請求快速檢索。這樣就可以避免花費時間取回并再次構建對象。緩存是一個廣泛的主題,是網站優化的一部分,可以自己完成一系列的文章。以下只是緩存的介紹和一個簡單而有效的方法來快速設置緩存的API響應。
為什么要緩存API響應?那么,房間里的大象是因為外部API會減慢你的網站。許多顧問會告訴您,利用外部API將通過減少連接數量和處理性能以及成本高的帶寬來提高網站的性能,但有時這根本不是真的。
您的服務器可以發送數據的速度與遠程服務器處理請求所需的時間,構建數據并將其發送回來,這是一個很好的平衡。第二個顯著的方面是,許多API在一段時間內具有有限數量的請求,并且可能一次應用程序對連接數量的限制。緩存有助于通過在服務器上放置數據副本來解決這些難題,直到需要刷新。
## 什么時候應該緩存?
這個簡單的答案是*總是*,但再次有時你不應該。 如果您正在處理實時數據或API專門指出不緩存在標題中,您可能不想緩存,但對于所有其他情況,通常最好緩存從API檢索的任何資源。
## WordPress瞬變
WordPress瞬態提供了一種方便的方法來存儲和使用緩存的對象。 瞬態生存指定的時間,或者直到您需要它們在API更新資源時過期。 在WordPress中使用瞬態功能可能是您遇到的最簡單的緩存系統。 只有三個功能 to do all the heavy lifting for you.
## 緩存一個對象(設置一個瞬態)
使用set_transient()函數來緩存對象。 此功能需要以下三個參數:
- $transient - 短暫的名稱供將來參考
- $value - 瞬態值
- $expiration - 從暫時保存到到期之前有多少秒鐘
從上面緩存GitHub用戶信息響應一個小時的例子是
```
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
set_transient( 'blobaugh_github_userinfo', $response, 60*60 );
```
## 獲取一個緩存的對象(獲取一個暫時的)
獲取緩存的對象比設置一個臨時對象要復雜得多。 您需要請求瞬態,但是您還需要檢查以確定瞬態是否已過期,如果是這樣,獲取更新的數據。 通常,set_transient()調用是在get_transient()調用之內進行的。 以下是獲取GitHub用戶配置文件的臨時數據的示例:
```
$github_userinfo = get_transient( 'blobaugh_github_userinfo' );
if( false === $github_userinfo ) {
// Transient expired, refresh the data
$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );
set_transient( 'blobaugh_github_userinfo', $response, 60*60 );
}
// Use $github_userinfo as you will
```
## 刪除緩存的對象(刪除一個瞬態)
刪除緩存的對象是所有瞬態函數中最簡單的,只需傳遞一個瞬態名稱的參數即可完成。
要刪除Github用戶信息:
```
delete_transient( 'blobaugh_github_userinfo' );
```
- 簡介
- 主題開發
- WordPress許可證
- 什么是主題
- 開發環境
- 主題開發示例
- 主題基礎
- 模板文件
- 主樣式表(style.css)
- 文章類型
- 規劃主題文件
- 模板層級
- 模板標簽
- 循環
- 主題函數
- 連接主題文件和目錄
- 使用CSS和JavaScript
- 條件標簽
- 類別,標簽和自定義分類
- 模板文件
- 內容模板文件
- 頁面模板文件
- 附件模板文件
- 自定義內容類型
- 部分和其他模板文件
- 評論模板
- 分類模板
- 404頁面
- 主題功能
- 核心支持的功能
- 管理菜單
- 自定義Headers
- 自定義Logo
- 文章格式
- 置頂文章
- Sidebars
- Widgets
- 導航菜單
- 分頁
- 媒體
- Audio
- Images
- Galleries
- Video
- 精選圖片和縮略圖
- 國際化
- 本地化
- 輔助功能
- 主題選項 – 自定義API
- 定制對象
- 改進用戶體驗的工具
- 定制JavaScript API
- JavaScript / Underscore.js渲染的自定義控件
- 高級用法
- 主題安全
- 數據消毒/逃避
- 數據驗證
- 使用隨機數
- 常見漏洞
- 高級主題
- 子主題
- UI最佳實踐
- JavaScript最佳做法
- 主題單元測試
- 驗證你的主題
- Plugin API Hooks
- 發布你的主題
- 所需的主題文件
- 測試
- 主題評論指南
- 寫文檔
- 提交你的主題到WordPress.org
- 參考文獻
- 模板標簽列表
- 條件標簽列表
- 編碼標準
- HTML編碼標準
- CSS編碼標準
- JavaScript編碼標準
- PHP編碼標準
- 插件開發
- 插件開發簡介
- 什么是插件
- 插件基礎
- 頭部要求
- 包括軟件許可證
- 啟用 / 停用 Hooks
- 卸載方法
- 最佳做法
- 插件安全
- 檢查用戶功能
- 數據驗證
- 保護輸入
- 保護輸出
- 隨機數
- Hooks
- Actions
- Filters
- 自定義Hooks
- 高級主題
- 管理菜單
- 頂級菜單
- 子菜單
- 短代碼
- 基本短碼
- 封閉短碼
- 帶參數的短代碼
- TinyMCE增強型短碼
- 設置
- 設置API
- 使用設置API
- 選項API
- 自定義設置頁面
- 元數據
- 管理帖子元數據
- 自定義元數據
- 渲染元數據
- 自定義文章類型
- 注冊自定義文章類型
- 使用自定義文章類型
- 分類
- 使用自定義分類
- 在WP 4.2+中使用“split術語”
- 用戶
- 創建和管理用戶
- 使用用戶元數據
- 角色和功能
- HTTP API
- JavaScript
- jQuery
- Ajax
- 服務器端PHP和入隊
- Heartbeat API
- 概要
- 計劃任務
- 了解WP-Cron計劃
- 安排WP-Cron 事件
- 將WP-Cron掛接到系統任務計劃程序中
- WP-Cron簡單測試
- 國際化
- 本地化
- 如何國際化您的插件
- 國際化安全
- WordPress.org
- 詳細插件指南
- 規劃您的插件
- 如何使用Subversion
- 插件開發者常見問題
- 開發工具
- Debug Bar 和附加組件
- 輔助插件
- REST API手冊
- 資源
- 文章
- 文章修訂
- 文章類型
- 文章狀態
- 類別
- 標簽
- 頁面
- 評論
- 分類
- 媒體
- 用戶
- 設置
- 使用REST API
- 全局參數
- 分頁
- 鏈接和嵌入
- 發現
- 認證
- 經常問的問題
- 骨干JavaScript客戶端
- 客戶端庫
- 擴展REST API
- 添加自定義端點
- 自定義內容類型
- 修改回應
- 模式
- 詞匯表
- 路由和端點
- 控制器類