2015-02-09 139 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