原文:http://yuguo.us/weblog/php-rest-api/
表征狀態轉移(英文:REpresentational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。
越來越多的公司開放了API,比如騰訊開放平台,淘寶開放平台,百度開放平台,Google Developers等。開放的方式各不相同,有REST和SOAP兩種。
REST很容易理解,而且只要是支持HTTP/HTTPS的客戶端/服務器就支持它。你可以用HTTP GET方法來執行命令。所以,開發者們感受到的REST的優勢是:開發簡單、只需依托現有Web基礎設施、以及學習成本低。
然而,SOAP作為一種古老的Web服務技術,短期內還不會退出歷史舞台。
在我們第三方開發者的PHP應用程序中如果要使用REST API,主要分為兩個步驟。一、生成請求。二、處理返回值。
一、生成請求
主要有三種方法來生成一個HTTP請求。
第一種方法就是手動生成請求,使用PHP的header方法。這給了你最大的靈活性,但是需要更多的 編碼。
第二種方法是使用PHP內置的file_get_contents()方法或者file()/fopen()/fread()/fclose()方 法,使用這種方法少了一點靈活性,但是代碼量非常少。
第三種方法是使用跟API配套的自定義Class,或者叫SDK。如果可以的話,盡量使用第三種方 法,它是最方便的。
手動生成請求
手動生成請求只有在第一次處理的時候才有點棘手,以后的話可以調用方法直接得到結果。此外了解手動生成請求的過程也有助於理解REST和HTTP。
function callAPI($endpoint, $devkey, $action, $type, $keyword) { $action = urlencode($action); $type = urlencode($type); $keyword = urlencode($keyword); $url = $endpoint . "?devkey=$devkey&action=$action&type=$type&keyword=$keyword"; $url_info = parse_url($url); $host = $url_info['host']; $path = $url_info['path'] . "?" . $url_info[‘query']; $data = ""; $fp=fsockopen($host, 80); fputs($fp, "POST ". $path . "HTTP/1.1\r\n"); fputs($fp, "Host: ". $host ."\r\n"); fputs($fp, "Accept: */*\r\n"); fputs($fp, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"); fputs($fp, "Connection: close\r\n"); fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-Length: ". strlen($data) . "\r\n\r\n"); fputs($fp, "$data"); $response=""; while(!feof($fp)) { $response.=fgets($fp, 128); } fclose($fp); list($http_headers, $http_content)=explode("\r\n\r\n", $response); return $http_content; }
快速方法(使用PHP的內置方法file_get_contents會讓代碼量少很多(也少了一些靈活性)。)
function callAPIQuick($endpoint, $devkey, $action, $type, $keyword) { $action = urlencode($action); $type = urlencode($type); $keyword = urlencode($keyword); $url = $endpoint . "?devkey=$devkey&action=$action&type=$type&keyword=$keyword"; $response = @file_get_contents($url); return $response; }
SDK方法
很多開放平台都會提供各語言的SDK下載,比如淘寶開放平台就提供了java、.net、PHP的SDK,並且還能夠根據每個應用的API調用權限進行單獨打包。
原文作者沒有提到curl方法,這個方法也很方便.
二、處理返回值
返回值要么是JSON格式,要么是XML格式。
如果是XML的話,可以使用PHP5的simplexml來解析。自從PHP 5.2,也已經默認加入了JSON格式的支持。