坚持将NSDictionary转换为POST字符串

时间:2015-02-09 12:26:07

标签: ios swift asynchronous nsdictionary

所以我试图从我的iOS设备向我的服务器发出异步POST请求。

这是我写过的Swift代码:

    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编写)。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

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)

基本上将每个项目转义并转换为&#34; key = value&#34;然后将它们全部串在一起,用&#34;&amp;&#34;

分隔

您也可能(可能)需要按照bbarnhart的建议设置Content-Type标头:

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

答案 1 :(得分:1)

要配置帖子,您需要做三件事。

将Content-Type设置为application / x-www-form-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")