2012-12-01 94 views
7

我開發了一個非常快速和簡單的PHP應用程序,用於從XML文件讀取分類廣告並允許用戶對其執行CRUD操作(這是一項家庭作業)。在PHP中創建一個RESTful API?

我現在的任務是將此應用程序開發爲RESTful服務。這位教授實際上對RESTful服務似乎沒有任何經驗,因爲他說我的應用程序被發現要交給下一個任務,當時我的研究表明它沒有真正滿足所有RESTful需求。

無論如何,爲了學習的目的,我想正確地做到這一點,即使我可以交出舊作業並獲得好成績。儘管如此,我仍然無法學習。我不確定RESTful服務究竟是什麼。

我認爲獲得建議的最好方法是從我以前的任務中發佈示例代碼,以瞭解我如何處理事情以及如何處理事情。

例如,這裏是我如何創建新的分類。

Create.php

//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields 

CreateSuccess.php

<html><head><?php $simplerXML = simplexml_load_file('file.xml'); 
//Generate the basic ad information 
$newAd = $simplerXML->addChild('advertisement',''); 
$newAd->addAttribute('category', $_POST["category"]); 
$title = $newAd->addChild('title', $_POST["title"]); 
$title->addAttribute('ID', $_POST["ID"]); 
$pageTitle = $newAd->addChild('pagetitle', $_POST["pagetitle"]); 
//etc, for all the SUBMIT boxes 

//save the XML 
$simplerXML->asXML('file.xml'); 
echo "<script type='text/javascript'> 
//redirect back to ad listing page 
window.onload = function() { top.location.href = 'ads.php'; }; 
</script>"; 
?></head> 
<body></body></html> 

我還使用了路德行動URL參數。我聽說網址參數也不被允許?

謝謝。

編輯: 所以SWITCH語句,它是否在index.php文件?然後每個案例都會調用一個函數,例如用於POST方法的CreateXML? 然後它需要的參數是對象類型,對象id和內容類型?如何獲取更新XML的值,我只是將它發送到包含輸入框列表的Create.php文件?

+0

關於你提到的其他問題:是的,你可以把'之開關在你的指數。 php,或者如果你想進入更復雜的架構,你可以引導一個處理路由的外部路由器組件。 URI解析僅供參考 - 我認爲您不需要它爲您的應用程序。鑑於您的應用程序的簡單性,您可以解析並路由請求方法以編輯您的單個文件。這仍然是RESTful。 –

+1

更一般地說,RESTfulness關注*接口*,而不是*實現*。 –

回答

15

如果您的服務支持所有CRUD操作,則始終建議實施RESTful界面。這樣做並不難。我已經概述了下面的一些基礎知識。

RESTful服務簡單地做幾件事情:

  1. 它使用HTTP請求方法爲CRUD動作的通信
  2. 它使用HTTP狀態代碼進行通信響應狀態,和
  3. 它使用URI來定義您的資源(您正在訪問的文件,數據庫項目等)。
  4. 它是無狀態的

的想法是,以儘量減少自定義通信的發展對於在HTTP規範已經定義了這些東西。


1 - 請求方法

4 HTTP請求你需要爲RESTful服務支持的方法有:

  1. POST
  2. GET
  3. PUT
  4. DELETE

,你可以有選擇地支持

  1. PATCH
  2. HEAD

如下您可以直接映射這些到您的CRUD操作:

  • POST =創建
  • GET =檢索
  • PUT =更新
  • DELETE =刪除
  • PATCH =編輯(部分更新,例如「更改密碼」。 PUT變爲如下用一個簡單的請求方法路由器正確 「替換」)僅
  • HEAD =報頭(元數據有關該資源)

爲此,路由請求:

switch ($_SERVER["REQUEST_METHOD"]) { 
    case "POST": 
     // Create action 
     break; 
    case "GET": 
     // Retrieve action 
     break; 
    case "PUT": 
     // Update action 
     break; 
    case "DELETE": 
     // Delete action 
     break; 
} 

2 - 狀態碼 您應該進一步實施來自您的服務的HTTP狀態碼,以便將狀態反饋回客戶端,例如:

  • 20X =成功
  • 30X =重定向
  • 40X =溝通問題
  • 50X =服務器錯誤

要做到這一點,只是前面加上合適的HTTP頭輸出,如你的迴應:

header("Status: 500 Internal Server Error"); 

您可以在此處引用實施的HTTP狀態代碼的完整列表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


3 - 的URI URI的,RESTful服務通常遵循自上而下的方法來分類命名,例如

/object_type/id.content_type 

例子:

POST /user 
PUT /user/1 
GET /user/1.json 
GET /user/1.html 

您可以實現在一個.htaccess文件使用Apache與mod_rewrite上述慣例,一個非常基本的RESTful的路由器,具體如下:

RewriteEngine On 
RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$ index.php?object_type=$1&object_id=$2&content_type=$3 

,那麼你會有index.php查找適當的object_type和id以適當地路由,例如:

$object = $_GET["object_type"]; 
$id = (int) $_GET["object_id"]; 
$content_type = $_GET["content_type"]; 

// Route from here to a class with the name of the object (e.g. UserController) via __autoload 
// or to a file (e.g. user.php) via include, and pass id and content_type as params 

4 - 無國籍 簡單地說,服務器維護無 「狀態」 的客戶端。無需存儲會話或狀態。每個請求都代表完整的交易。即如果我GET用戶/ 1,服務器不會記得我做到了,未來的請求不會依賴於或受到以前的影響。

如果您實施這些標準,恭喜,您已經構建了一個RESTful服務!

+0

很好的答案,恭喜! – m4t1t0

+0

非常感謝您的詳細解答。我可以看到你已經編輯了很多,你花的時間非常感謝。如果你可以看看,我還有幾個我已經編輯過的澄清問題。 – user1287523

+0

很抱歉重啓,但不應該將POST/user/1.xml設置爲POST/user?如果不是,我們怎麼知道這個數字?謝謝。 – JorgeeFG

4

「RESTful」是一個廣泛的概念,並有「RESTfulness」程度。 Wikipedia是一個很好的指南這裏

以下是對方的回答不是解決了一些更高級別的特性(這也很好):

  1. 資源可在網址,優選每資源只有一個規範的網址。
    • 您可以使用Content-Location標題指示資源在其他網址或表示形式中可用。
    • 通過使用與Acceptcontent-type標頭的內容協商,您可以提供資源(html,json,xml等)的不同表示
  2. 資源狀態的變化完全由單個HTTP請求表示。服務器不需要維護狀態來處理客戶端請求。因此,請求可以很容易代理和緩存。
    • 共同違反這一原則的一個例子是像「http://example.org/profile」的URL取決於誰在登錄該服務於不同的用戶配置文件。
    • 更好的將將資源與授權分開:「http://example.org/profile/{USERID}」將始終爲特定用戶的用戶ID提供服務,但如果客戶端沒有權限,則返回401(未授權)。 (此外,授權信息應該隨每個請求一起發送,以便服務器不需要會話令牌或類似的服務器端狀態。因此,大多數具有基於cookie的登錄系統的網站是純粹寧靜的而不是。)
    • GET檢索資源。這不應該改變資源的狀態,應該是安全可重複的。這個屬性通常被稱爲「冪等性」。
    • PUT更新資源。通過使用諸如conditional updating requests(PUT或DELETE和if-*標頭)等技術,您甚至可以實施樂觀併發控制。
    • 刪除刪除資源。
    • POST作爲一種「做某事」的資源。當您必須做一些不適合乾淨地放入http方法或需要執行具有副作用的操作時(例如,在不知道名稱或實現RPC協議的情況下創建新資源),將使用POST。但是,您需要使用http標題和響應代碼來顯示那些資源的副作用,例如帶有LocationContent-Location標題的「201 Created」,以及受更改影響的網址列表。
  3. 資源表示是自描述的「超文本」,包含指向其他資源的鏈接。
    • 一個違反這個原則的一個例子:假設「http://example.com/articles」是文章的列表和它的JSON表示看起來像[1,2,3,4,5,6]。這是一個文章ID列表,但它不是自我描述或超文本 - 客戶需要知道這是一個文章ID列表,它需要知道,要獲得文章資源,它必須構建一個像「 http://example.org/articles/1" 。
    • 更好的是像{"articles":[{"id":1,"url":"http://example.org/articles/1"},...]}這樣的響應。像html一樣,使用休息服務的客戶端應該只需要關注鏈接(而不是使鏈接)以獲取其他相關資源。你甚至可以記錄可用的方法,你可以用它來操作的資源 - 創建,更新,刪除等