2015-02-09 103 views
2

所以我試圖從我的iOS設備向我的服務器執行異步POST請求。Stuck將NSDictionary轉換爲POST字符串

下面是我寫的銀行代碼:

var urlString = "https://eamorr.com/ajax/login.php" 
    var url = NSURL(string: urlString) 
    var request = NSMutableURLRequest(URL: url!) 
    request.HTTPMethod = "POST" 
    var params = ["uname":"Eamorr", "pword":"mySecret"] as Dictionary<String, String> 
    request.HTTPBody = params. //what to do here??? 
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: true) 

的問題是,如何(可靠)的PARAMS轉換爲字符串POST? (我的服務器預計普通的舊POST參數...沒什麼奇特的 - 沒有JSON等)

我需要這是非常可靠的(即不是黑客),所以我寧願如果有一些基類(由Apple編寫)我可以使用。

有沒有人有任何想法?

+0

編寫自己的解決方案是不是黑客攻擊,並且很容易,如果該鍵和值始終爲字符串[中的ObjectiveC從創建對象的NSDictionary URL查詢參數(HTTP的 – Wain 2015-02-09 12:39:58

+0

可能重複: //stackoverflow.com/ques tions/718429/creating-url-query-parameters-from-nsdictionary-objects-in-objectivec) – Bill 2015-02-09 12:42:34

回答

1

要配置你的文章,你需要做三件事情。

集內容類型到應用程序/ x-WWW窗體-urlencoded

request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

設置體如由符號串限定的鍵/值,並轉換爲NSData的:

let myPostBody = "uname=Eamorr&pword=mySecret" 
request.HTTPBoddy = (myPostBody as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

集內容長度:

request.addValue(String(myPostBody.length), forHTTPHeaderField: "Content-Length") 
+0

看起來太冗長了。一些POST請求可能有10個參數 - 確保字符串正確是耗時且不必要的。 – Eamorr 2015-02-09 13:42:25

1

一些bbarnhart建議的,但實際上創建身體數據,使用:

let body = "&".join(map(params, { 
    let key = $0.0.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
    let value = $0.1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
    return "\(key!)=\(value!)" 
})) 
request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding) 

基本上逃脫,每個項目轉換成「鍵=值」,然後將它們串全部由「&」

在一起分開你也(可能)需要設置Content-Type頭所推薦的bbarnhart:

request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
+0

我最後去了Alamofire ...... – Eamorr 2015-02-09 22:53:24