2016-11-22 116 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