處理客戶端輸入
What?
- 客戶端IP
- 客戶端訪問的URI(資源路徑)
- User-Agent
- GET 參數(shù) (使用 URL 傳入的參數(shù))
- POST 參數(shù) (使用 HTTP Body 輸入的參數(shù))
這些都是常見的客戶端輸入內(nèi)容,是客戶端訪問服務(wù)器的過程中,給服務(wù)器發(fā)送的各種數(shù)據(jù)。
How?
GET
使用 PHP 獲取輸入非常簡單,使用 $_GET
或者 $_POST
就可以獲取到GET和POST參數(shù),它們是一個(gè)數(shù)組。
現(xiàn)在我們使用 iOS 客戶端發(fā)送一個(gè)請(qǐng)求到 http://localhost/index.php?name=Pony
//Swift Playground
//你可以在 Xcode 中創(chuàng)建一個(gè) Playground 運(yùn)行以下代碼
import UIKit
let 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))
這是一個(gè)很簡單的請(qǐng)求,我們只要發(fā)送一個(gè) GET 請(qǐng)求到 http://localhost/index.php ,然后帶上 GET 參數(shù), Key = name Value = Pony。
最后,我們獲取服務(wù)器返回的數(shù)據(jù),轉(zhuǎn)換為 String 打印出來。
如無意外,你可以在 Playground 中看到返回的結(jié)果。
現(xiàn)在,我們修改 index.php,讓 index.php 可以獲取到 Pony 這個(gè)字符串,并且返回處理好的字符串給客戶端。
//index.php
<?php
$name = $_GET["name"];
echo 'Hello, '. $name. '!';
再次運(yùn)行 Playground,可以看到Hello, Pony!
已經(jīng)顯示在結(jié)果欄中了。
確實(shí)非常簡單就把 GET 參數(shù)獲取到了,等等,現(xiàn)在逗比產(chǎn)品經(jīng)理來加一個(gè)需求,當(dāng) name 為空時(shí),請(qǐng)返回 "Nobody!"。
我們可以稍為修改一下代碼,對(duì) $_GET["name"]
使用 empty()
進(jìn)行判斷, empty()
的使用方法看這里。
<?php
if (!empty($_GET["name"])) {
$name = $_GET["name"];
echo 'Hello, '. $name. '!';
}
else {
echo 'Nobody!';
}
嘗試一下把 URL 中的 Pony 去掉看看執(zhí)行結(jié)果?
POST
獲取 POST 表單中的參數(shù)與獲取 GET 中的方法完全一樣!但是,我們先要在 Playground 中修改我們發(fā)送請(qǐng)求的代碼,讓它發(fā)送 POST 請(qǐng)求。
import UIKit
let 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
就可以了。
<?php
//index.php
if (!empty($_POST["name"])) {
$name = $_POST["name"];
echo 'Hello, '. $name. '!';
}
else {
echo 'Nobody!';
}
運(yùn)行一下 Playground 就可以看到效果了。
打印
還記得我說過, $_GET 和 $_POST 是數(shù)組嗎? 在 PHP 的世界里,你可以使用 print_r() 函數(shù)打印數(shù)組的所有信息,你可以看到當(dāng)前客戶端傳入的所有參數(shù),這對(duì)于調(diào)試應(yīng)用來說是非常便捷的。
<?php
print_r($_POST);
客戶端收到 PHP 的打印結(jié)果如下
Array
(
[name] => Pony
)
擴(kuò)展:獲取客戶端信息
客戶端的信息還包括 User-Agent 和 IP 等等,這些信息可以使用 $_SERVER
數(shù)組獲取,它的獲取方法和 GET POST 也完全一樣,你可以自行嘗試一下獲取客戶端的 IP 或者 User-Agent。
Ending
獲取客戶端的輸入是服務(wù)器開發(fā)的重要一步,這里,我們并沒有對(duì)用戶輸入作過濾,使用沒有過濾過的數(shù)據(jù)是非常危險(xiǎn)的,我將在后續(xù)的課程中詳細(xì)講解。
同時(shí),此節(jié)課程還未描述如何獲取 POST 請(qǐng)求中 HTTPBody 的方法,這也會(huì)在后續(xù)的課程中講解。
下一篇:同步執(zhí)行