透過內容類型自動剖析 HTTP 要求
PHP 5 版本 1.6.0 的 Slim Framework(目前處於開發分支)引入新的中間件,它會根據內容類型自動剖析 HTTP 要求主體。此中間件會剖析具有 JSON、XML 或 CSV 內容類型的 HTTP 要求。如需啟用此中間件,請執行下列動作
$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes());
將 Slim_Middleware_ContentTypes 中間件新增至您的 Slim 應用程式後,便會適當地剖析 Request 物件的主體屬性。不過,您隨時可以在 Slim 應用程式的環境陣列中,使用金鑰 slim.input_original
來擷取未經過剖析的原始要求主體。
JSON 要求
此中間件會將 JSON 要求的主體剖析成關聯性陣列。假設您將 HTTP 要求傳送至下列 POST 路徑。要求主體為 {"name":"John","email":"john.doe@gmail.com"}
。
$app->post('/book', function () use ($app) {
$body = $app->request()->getBody();
}
在此範例中,$body 變數將等於 array('name' => 'John', 'email' => 'john.doe@gmail.com')
。
XML 要求
如果 SimpleXML 擴充功能可用,此中間件會將 XML 要求的主體剖析成 SimpleXMLElement 執行個體;否則主體將保持為字串。假設您將 HTTP 要求傳送至上方的 POST 路徑。HTTP 要求主體為
<book>
<id>1</id>
<title>Sahara</title>
<author>Clive Cussler</author>
</book>
$body
變數將為 SimpleXMLElement 的執行個體;您可以使用 $body->id
、$body->title
或 $body->author
來擷取 POST 的 book 屬性。
CSV 要求
此中間件會將 CSV 要求的主體剖析成陣列或陣列的陣列。假設您將 HTTP 要求傳送至上方的 POST 路徑。HTTP 要求主體為
Doe,John,john.doe@gmail.com
Doe,Jane,jane.doe@gmail.com
$body
變數將為下列陣列
array(
array('Doe','John','john.doe@gmail.com'),
array('Doe','Jane','jane.doe@gmail.com')
);
自訂內容類型
如果您想要剖析非 JSON、XML 或 CSV 的 HTTP 要求主體,您可以使用中間件的第二個選用參數,提供自己的剖析函數。您需要知道 HTTP 要求的內容類型,並且需要準備一個可呼叫的項目來剖析要求主體。剖析 HTTP 要求主體的可呼叫項目應該接受字串參數,並傳回適當的 PHP 資料結構。
假設我們希望上方的 POST 路徑可以接受具有 HTML 主體的 HTTP 要求。我們會指示 Slim_Middleware_ContentTypes 中間件,以像這樣的方式剖析這些要求
function parseHtml( $rawBody ) {
$dom = new DOMDocument();
$dom->loadHTML($rawBody);
return $dom;
};
$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes(array(
'text/html' => 'parseHtml'
)));
假定我們繼續使用以上定義的 POST 路由,變數 $body
會成為一個 DOMDocument 實例,代表 HTTP 要求中的 HTML。你定義的客製化解析函式會與預設的解析函式 (透過內容類型建立索引) 合併。在這個範例中,Slim_Middleware_ContentTypes 中介軟體現在會解析具有 JSON、XML、CSV 或 HTML 內容類型的 HTTP 要求。
如果你希望覆寫 JSON 要求的預設解析函式,就為內容類型 application/json
定義一個新的解析器;然後你的解析器會用來取代預設解析器。