2016-11-22 80 views
0

这是服务器(使用codeigniter)接受的可接受的POST请求。Swift3:参数除以“/”的HTTP POST请求

正如所示,它不需要键,而只需要值。

第一个值以“/”开始,“/”在值之间使用。

http://example.com/index.php/api/signup/value01/value02/value03 

我有这段代码,写在Swift3中。

let serverUrl = "http://example.com/index.php/api/signup" 
let parameterString = "/value01/value02/value03" 

let url: URL = URL(string: serverUrl)! 
let session = URLSession.shared 
let request = NSMutableURLRequest(url: url) 
request.httpMethod = "POST" 
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
request.httpBody = parameterString.data(using: String.Encoding.utf8) 

let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in 

}) task.resume() 

它得到一个错误,服务器响应它没有收到任何参数。

但是,如果我将下面的代码复制粘贴到浏览器,它的工作原理是完美的。

http://example.com/index.php/api/signup/value01/value02/value03 

swift3代码适用于另一台服务器,它接受以这种方式写入的POST请求。

http://example.com/api?key=value&key=value 
+2

然后只是让所有的参数结合成为它的网址,成为你的一个?这不似乎正常的帖子主体,所以可能它不会做任何事 – Tj3n

+1

你应该使用URLRequest声明它作为变量,而不是使用NSMutableRequest –

+3

你应该''parameterString'附加到'serverUrl'而不是将其设置为HTTP正文。当你将它设置为HTTP正文时,甚至API也必须被编程为从正文读取,而不是在这种情况下。它在URL中查找数据不在主体中。 – GoodSp33d

回答

1

谢谢@ Tj3n @Leo Dabus @ GoodSp33d!

我能够使用您的建议来解决问题。

对于某些字符串值,服务器php也使用“URL编码RFC 1738(例如”爱“的”%E6%84%9B“))。

所以,我说

let newString = oldString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)! 

编码一些字符串值和解决的问题。

所以,这是一个简化版本的解决方案。

let serverUrl = "http://example.com/index.php/api/signup/value01/value02/value03" 

let url: URL = URL(string: serverUrl)! 
let session = URLSession.shared 
var request = URLRequest(url: url) 
request.httpMethod = "POST" 
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in 

}) task.resume() 

这是我的代码发送的真正的POST请求url。

http://example.com/index.php/api/signup/1282283772/none/0204291/%E6%84%9B/0/70/null