在 PHP 中發起 HTTP 請求並不是很難,有很多種方法︰使用 fopen()函數,使用 cURL 擴展,使用文件操作函數如 fsockopen() 和 fwrite()。但是問題是各種方法所依賴的服務器的配置把不同,有些服務器可能無法支持,不過 WordPress 自身開發了新的 API 使得在所有環境下都非常容易發起 HTTP Requests。
PHP 類︰WP_Http
WordPress 2.7 開始引入了一個新的 PHP Class︰WP_Http(在 wp-includes 目錄 http.php 文件中)。這個 Class 的強大之處是它會檢測服務器的情況,選擇最好的方法去實現 HTTP 請求,所以我們自己無須去檢測 HTTP 擴展,fopen(),是否存在 curl_init() 函數,這個 Class 都會包辦這些檢測。
這個 Class 的基本使用方法如下︰
| $request = new WP_Http; $result = $request->request( 'http://some.url.you-need.to-fetch' ); |
返回的變量 $result 是一個數組,它包含以下東西︰
| 以下為引用的內容︰ |
下面是具體的例子︰
簡單的 GET 請求
假設你想在 Twitter 上搜索所有含有你 ID 的信息︰
| $url = 'http://search.twitter.com/search.json?q=@denishua'; $request = new WP_Http; $result = $request->request( $url ); $json = $result['body']; |
接下來就是 JSON 解碼的事情了。
基本的 POST 請求
如過你需要傳遞一些參數,如 nick=’denishua’ 和 mood=’happy’,可以使用 POST 方法︰
| $body = array( 'nick' => 'denishua', 'mood' => 'happy' ); $url = 'http://your.api.url/'; $request = new WP_Http; $result = $request->request( $url, array( 'method' => 'POST', 'body' => $body) ); // test $result['response'] and if OK do something with $result['body'] |
需要驗證的 POST 請求
假如你需要使用 Twitter Stauts Update API 更新 Twitter,你需要首先驗證你的 Twitter 賬戶,我們需要發送一個含有用戶名和密碼對的 base64 編碼的字符串給 Twitter,詳細如下︰
| // You would edit the following: $username = 'denishua'; // Twitter login $password = '123456'; // Twitter password $message = "I'm posting with the API"; // Now, the HTTP request: $api_url = 'http://twitter.com/statuses/update.xml'; $body = array( 'status' => $message ); $headers = array( 'Authorization' => 'Basic '.base64_encode("$username:$password") ); $request = new WP_Http; $result = $request->request( $api_url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers ) ); |
翻譯自 How To Make HTTP Requests with WordPress
WordPress 加入 WP_Http 類之後,就放棄了 Snoopy 這個 PHP Class,所以建議大家給 WordPress 寫插件的時候,盡量使用 WP_Http 來做 HTTP 請求。
WordPress 已經可以認為是 PHP 框架了,它含有各種類和方法,並且接口和方法使用非常簡單,並且文檔化,所以使用 WordPress 作為 PHP 框架進行開發,或者抽取 WordPress 中的一些類進行開發會起到事半功倍的效果。
原文︰http://fairyfish.net/2009/08/22/how-to-make-http-requests-with-wordpress/
