iOS 全棧攻城獅(PHP) —— Session 3

處理客戶端輸入

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é)果欄中了。

結(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í)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評(píng)論 18 139
  • 1、雙引號(hào)和單引號(hào)的區(qū)別 雙引號(hào)解釋變量,單引號(hào)不解釋變量 雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話,變量解...
    尋夢(mèng)xunm閱讀 327評(píng)論 1 7
  • 又是一個(gè)九月,學(xué)校開學(xué)了,一年一度的“百團(tuán)大戰(zhàn)”也來了。 學(xué)校禮堂前的那一塊空地上,陸陸續(xù)續(xù)的搭建好了一個(gè)個(gè)帳篷展...
    木子堇色閱讀 454評(píng)論 0 0
  • 獲取遠(yuǎn)程文件(圖片等) 有三種方式 1.file_get_contents($url);使用file_get_co...
    kison30閱讀 153評(píng)論 0 0
  • 你是我眼底的一片湖 而那湖上的風(fēng)景 早已成了往昔的夢(mèng) ——立黃昏 今夜,我不想讀書 只想在這個(gè)月夜...
    立黃昏閱讀 1,214評(píng)論 60 71