處理用戶端輸入
What?
- 用戶端IP
- 用戶端訪問的URI(資源路徑)
- User-Agent
- GET 參數 (使用 URL 傳入的參數)
- POST 參數 (使用 HTTP Body 輸入的參數)這些都是常見的用戶端輸入內容,是Client Access Server的過程中,給伺服器發送的各種資料。
How?
GET
使用 PHP 擷取輸入非常簡單,使用 $_GET 或者 $_POST 就可以擷取到GET和POST參數,它們是一個數組。
現在我們使用 iOS 用戶端發送一個請求到 http://localhost/index.php?name=Pony
//Swift Playground//你可以在 Xcode 中建立一個 Playground 運行以下代碼import UIKitlet request = NSMutableURLRequest(URL: NSURL(string: "http://localhost/index.php?name=Pony")!)NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, responseData, error) -> Void in if let responseData = responseData { if let responseString = String(data: responseData, encoding: NSUTF8StringEncoding) { print(responseString) } }}NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 10))
這是一個很簡單的請求,我們只要發送一個 GET 請求到 http://localhost/index.php ,然後帶上 GET 參數, Key = name Value = Pony。最後,我們擷取伺服器返回的資料,轉換為 String 列印出來。如無意外,你可以在 Playground 中看到返回的結果。
現在,我們修改 index.php,讓 index.php 可以擷取到 Pony 這個字串,並且返回處理好的字串給用戶端。
//index.php 再次運行 Playground,可以看到Hello, Pony! 已經顯示在結果欄中了。
結果
確實非常簡單就把 GET 參數擷取到了,等等,現在逗比產品經理來加一個需求,當 name 為空白時,請返回 "Nobody!"。
我們可以稍為修改一下代碼,對 $_GET["name"] 使用 empty() 進行判斷, empty() 的使用方法看這裡。
嘗試一下把 URL 中的 Pony 去掉看看執行結果?
POST
擷取 POST 表單中的參數與擷取 GET 中的方法完全一樣!但是,我們先要在 Playground 中修改我們發送請求的代碼,讓它發送 POST 請求。
import UIKitlet request = NSMutableURLRequest(URL: NSURL(string: "http://localhost/index.php")!)request.HTTPMethod = "POST"request.HTTPBody = "name=Pony".dataUsingEncoding(NSUTF8StringEncoding)NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, responseData, error) -> Void in if let responseData = responseData { if let responseString = String(data: responseData, encoding: NSUTF8StringEncoding) { print(responseString) } }}NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 10)) 然後,把 index.php 中 $_GET 的部分換成 $_POST 就可以了。
運行一下 Playground 就可以看到效果了。
列印
還記得我說過, $_GET 和 $_POST 是數組嗎? 在 PHP 的世界裡,你可以使用 print_r() 函數列印數組的所有資訊,你可以看到當前用戶端傳入的所有參數,這對於調試應用來說是非常便捷的。
用戶端收到 PHP 的列印結果如下
Array( [name] => Pony)
擴充:擷取用戶端資訊
用戶端的資訊還包括 User-Agent 和 IP 等等,這些資訊可以使用 $_SERVER 數組擷取,它的擷取方法和 GET POST 也完全一樣,你可以自行嘗試一下擷取用戶端的 IP 或者 User-Agent。
Ending
擷取用戶端的輸入是伺服器開發的重要一步,這裡,我們並沒有對使用者輸入作過濾,使用沒有過濾過的資料是非常危險的,我將在後續的課程中詳細講解。同時,此節課程還未描述如何擷取 POST 請求中 HTTPBody 的方法,這也會在後續的課程中講解。
下一篇: