[ SWIFT ] - NSURLComponents & NSURLQueryItem &%25異常說明

[ NSURLComponents ]:用來替代NSMutableURL

NSURL NSURLComponents 的不同之處在於,URL component屬性是 readwrite 的。它提供了安全直接的方法來修改URL的各個部分:

scheme:請設定http 或 https
user:帳號
password:密碼
host:主機名稱
port
path:路徑
query:參數
queryItems:
 query和queryItems請擇一使用。
fragment:片段網址


如果組成的URL是一個非法的schemeport,會拋出一個異常,回傳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/

留言

熱門文章