搭建一個apache伺服器,用php編寫一個返回給客戶端請求資料的指令碼
1 <?php 2 // header("Content-type:text/html;charset=utf-8"); 3 header("Content-type:text/json;charset=utf-8"); 4 if (isset($_REQUEST['name'])) { 5 $result = $_REQUEST['name']; 6 $arr=array("result"=>$result); 7 $json=json_encode($arr); 8 echo $json; 9 } 10 ?>
該php實現了接收一個客戶端的遠端post或者get請求,然後返回給其一個簡單的json字串,
開啟Xcode建立一個singleView工程,在IB中新增一個button和一個label並連線到程式碼中的outlet,我的測試php檔案的地址為:
let url = "http://192.168.1.106/apprequesttest/index.php"
下面開始描述兩種實現網路請求的方法,在button的action事件中新增網路請求
IOS SDK自帶的網路請求方法:
GET請求方法:
1 var msg = "jimmy" 2 NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: NSURL(string: "\(url)?name=\(msg)")!), queue: NSOperationQueue()) { (res:NSURLResponse!, data:NSData!, error:NSError!) -> Void in 3 if let d = data{ 4 var getMsg = NSString(data: d, encoding: NSUTF8StringEncoding)! as String 5 dispatch_async(dispatch_get_main_queue(), { () -> Void in 6 self.label.text = getMsg 7 }) 8 } 9 }
POST請求方法:
1 var req = NSMutableURLRequest(URL: NSURL(string: url)!) 2 req.HTTPMethod = "POST" 3 req.HTTPBody = NSString(string: "name=jimmy").dataUsingEncoding(NSUTF8StringEncoding) 4 NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue()) { (_, data, _)-> Void in 5 if let d = data{ 6 var postMsg = NSString(data: d, encoding: NSUTF8StringEncoding) 7 dispatch_async(dispatch_get_main_queue(), { () -> Void in 8 self.label.text = postMsg! as String 9 }) 10 } 11 }
第三方開源庫Alamofire:
Alamofire是swift網路程式設計中替代AFNetworking的第三方開源庫,作者為同一人,使用Alamofire需要在github上下載該庫,然後將其引入到工程中,如下圖示:
將解壓包中的Alamofire.xcodeproj拖拽到專案名下
在Embedded Binaries中新增上面紅色箭頭的尾部的framework,注意不要新增下面的framework,雖然二者名字一樣,但是上面的是ios的庫,下面的是osX的庫,點選add按鈕,執行程式,確保編譯成功。
在我們的工程檔案裡面飲入Alamofire便可以使用它了
1 Alamofire.request(.POST, url, parameters: ["name":"jimmy"]).responseJSON(options: NSJSONReadingOptions.AllowFragments) { (req, _, json, _) -> Void in 2 // println(req.URLString) 3 // println(json?.valueForKey("result")) 4 self.label.text = json?.valueForKey("result") as? String 5 6 }
通過Alamofire可以只需要幾行程式碼就完成網路資料的請求,上面的的parameters是給php發了一個post請求,請求名稱是name,值為“jimmy”,這樣label上就會快速的顯示返回的json資料,由於alamofire本就是非同步請求,所以不必像第一種方法那樣在更新UI的時候,還要跳到主執行緒,在Alamofire中,請求只要返回正確,便可以在必包函式中任意的做UI上的操作了