iOS的URL處理,iOSURL處理
前兩天處理iOSapp過程中(我是用swift語言寫的,資料較少),被一個“字串”搞了一晚上的時間到第二天才處理好,在此記下,望見過此文的學生有一天遇到該情況能三分鐘搞定不浪費時間:
先看如下代碼
func getBalance(){
let url = NSURL(string: "http://www.weather.com.cn/data/sk/101110101.html")
let data = NSData(contentsOfURL: url!)
if data != nil {
let dict: NSDictionary = (try! NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)) as! NSDictionary
let weatherInfo = dict.objectForKey("weatherinfo") as! NSDictionary
print("得到天氣資料了")
var city = weatherInfo.objectForKey("city") as! String
print("得到城市名稱了")
... ...
}
}
是不是覺得沒什麼,直接存取就可以了,沒錯,但是這隻是最基本的URL地址,要是我們的地址是這樣子的呢
http://183.252.21.19:81/bhys/d/api/?apiType=check&rqsJson={"cardNo":"999000002111","pwd":"000211","name":"民生卡11"}&sign=123456789
會發現我們的字串裡有雙引號,參數有中文等特殊字元,這個時候,再直接存取會出現什麼情況?不對,是根本訪問不了,因為很顯然我們需要在let url = NSURL(string: "http://......")該字串裡進行轉義,用我們的斜杠/"但是轉了之後還是無法通過,Xcode會報錯:url is nil
因為我也是第一次接觸app開發,沒有OC經驗,不曉得是iOS原本就不識別/轉義還是swift不識別,畢竟新語言。
問題的解決是另一種“轉義”——編碼,將URL進行encode編碼一下就可以了,上面那段URL將雙引號和大括弧經過encode編碼如下:
http://183.252.21.19:81/bhys/d/api/?apiType=check&rqsJson=%7B%22cardNo%22:%22999000002111%22,%22pwd%22:%22pwd%22,%22name%22:%22民生卡11%22%7D&sign=123456789
這個時候不僅可以訪問,還可以加參數,如下:
http://183.252.21.19:81/bhys/d/api/?apiType=check&rqsJson=%7B%22cardNo%22:%22"+IDNumber+"%22,%22pwd%22:%22"+pwdNumber+"%22,%22name%22:%22"+Name+"%22%7D&sign=123456789
記住:
一、有編碼就有解碼,不過解碼那是服務端的事情了,移動端開發人員要知道這件事情。
二、上文只是提供一個思路,讓遇到URL問題的同學知道有encode編碼這件事,具體的轉碼還要看服務端的,有些服務端只提供一部分轉碼,如上文,只轉
{"cardNo":"999000002111","pwd":"000211","name":"民生卡11"},而http://183.252.21.19:81/bhys/d/api/?apiType=check&rqsJson=沒有轉碼,這都是可能的,還需變通,不可照搬。