[ SWIFT ] - NSURLComponents & NSURLQueryItem &%25異常說明
[ NSURLComponents ]:用來替代NSMutableURL
NSURLComponents-程式範例:-------------------------------------
NSURL 和 NSURLComponents 的不同之處在於,URL component屬性是 readwrite 的。它提供了安全直接的方法來修改URL的各個部分:
scheme:請設定http 或 https
user:帳號
password:密碼
host:主機名稱
port
path:路徑
query:參數
queryItems:
※ query和queryItems請擇一使用。
fragment:片段網址
如果組成的URL是一個非法的scheme或port,會拋出一個異常,回傳nil(簡單說只要網址錯誤就是回傳nil)。
QueryItem-程式範例:-------------------------------------------------
[完整網址]
http://www.kimo.com.tw:9600/SmSendGet.asp?username=a&password=12345& dstaddr=20150520&msg=app%B4%FA%B8%D5&response=http://192.168.1.200/smreply.asp
let baseURL = "http://www.kimo.com.tw:9600/SmSendGet.asp?"
let queryItem1 = NSURLQueryItem(name: "username", value: "a")
let queryItem2 = NSURLQueryItem(name: "password", value: "12345")
let queryItem3 = NSURLQueryItem(name: "dstaddr", value: "20150520")
//注意:當資料存入NSURLQueryItem時會被編碼,。
var urlComponents = NSURLComponents(string: baseURL)!
//透過queryItems組合queryItem1~ queryItem3
urlComponents.queryItems = [queryItem1,queryItem2,queryItem3]
var regURL = urlComponents.URL!
let urlResquest = NSURLRequest(URL: regURL)
NSURLComponents-程式範例:-------------------------------------
urlComponents.scheme = "http:"
urlComponents.host = "www.kimo.com.tw:9600/SmSendGet.asp?"
urlComponents.user = "a"
urlComponents.password="12345"
let queryItem1 = NSURLQueryItem(name: "username", value: "a")
let queryItem2 = NSURLQueryItem(name: "password", value: "12345")
let queryItem3 = NSURLQueryItem(name: "dstaddr", value: "20150520")
//使用NSURLComponents雖然可以逐一進行設定,但是baseURL = "http://www.kimo.com.tw:9600/SmSendGet.asp?"還是比較方便!!
[中文編碼]
在很多時候我們會需要傳遞中文內容,以下的方式可以針對中文進行編碼
var big5 = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.Big5_HKSCS_1999.rawValue))
var str = self.smstext.text
var data = self.smstext.text.stringByAddingPercentEscapesUsingEncoding(big5)
透過上面的方式,我們可以將app測試 編碼為 app%B4%FA%B8%D5
但是當使用NSURLQueryItem時會出現錯誤,因為存入QueryItem時會被自動編碼,導致編碼二次的情況!因此如果是已經編碼的資料,就會出現錯誤!
範例:
app測試 編碼後為 app%B4%FA%B8%D5
如果你將編碼後資料設定給NSURLQueryItem(name: "dstaddr", value: "app%B4%FA%B8%D5"),將導致以編譯過的資料再被編譯過一次而變成
app%25B4%25FA%25B8%25D5,因為%的代碼是25,如此將造成你的 URL錯誤而回傳nil
url編碼網址:
http://www.mytju.com/classCode/tools/urlencode_big5.asp
解決方法:
使用2個NSURL,一個透過urlComponents組成前半段的網址,另一個負責存已經編碼後的內容,再將2個URL組合在一起
var regURL = urlComponents.URL!
//regURL的內容:http://www.kimo.com.tw:9600/SmSendGet.asp?username=a&password=12345& dstaddr=20150520
var regURL2 = NSURL(string: "\(regURL)\(str.stringByAddingPercentEscapesUsingEncoding(big5)!)&response=http://192.168.1.200/smreply.asp")
//regURL2的內容:http://www.kimo.com.tw:9600/SmSendGet.asp?username=a&password=12345& dstaddr=20150520&msg=app%B4%FA%B8%D5&response=http://192.168.1.200/smreply.asp
let urlResquest = NSURLRequest(URL: regURL2!)
參考資料來源:http://nshipster.com/nsurl/
留言
張貼留言
您好:
歡迎到訪我的Blog,這裡有我的生活經驗、美好的回憶和程式開發經驗分享~
目前努力學習Swift中,希望你會喜歡Swift!
如果可以也請你留言給我一個鼓勵喔!
謝謝