iOS Swift如何在NSURL中使用包含%2的字符串?

时间:2016-08-25 13:30:30

标签: ios swift nsurl

我对使用Web服务和编码一般都很陌生。如果我没有任何意义,请告诉我。

我使用两种方法构建一个用于调用flickr API的url。一切运作良好,我唯一无法工作的是在我的网址中使用“%2Curl_m”参数。当构建url时,“%2Curl_m”变为“%252Curl_m”。

我试过google并在这里搜索,但我找不到答案。唯一接近的是它可能与字符串编码有关。我查看了文档,但我真的没理由。

我使用这两种方法来构建url:

private class func flickrURL(method method: Method, page:Int,
    parameters: [String:String]?) -> NSURL {
        let components = NSURLComponents(string: baseURLString)!
        var queryItems = [NSURLQueryItem]()

        let baseParams = [
            "method": method.rawValue,
            "format": "json",
            "nojsoncallback": "1",
            "api_key": APIKey,
            "text": "car",
            "per_page": "50",
            "page": String(page)
        ]

        for (key, value) in baseParams {
            let item = NSURLQueryItem(name: key, value: value)
            queryItems.append(item)
        }

        if let additionalParams = parameters {
            for (key, value) in additionalParams {
                let item = NSURLQueryItem(name: key, value: value)
                queryItems.append(item)
            }
        }

        components.queryItems = queryItems
    print(components.URL!)

        return components.URL!
}


private static var nextPage = 0
class func recentPhotosURL() -> NSURL {
    nextPage += 1
    print(nextPage)
    let curl = "%2Curl_m"
    print(curl)
    return flickrURL(method: .RecentPhotos, page: nextPage,
        parameters: ["extras": "\(curl),url_h,date_taken"])
}

我得到的网址是:

https://api.flickr.com/services/rest?page=2&text=car&api_key=XXXXXXXXXXXXXXXXXXX&method=flickr.photos.search&per_page=50&format=json&nojsoncallback=1&extras=%252Curl_m,url_h,date_taken

我需要的网址是:

https://api.flickr.com/services/rest?page=2&text=car&api_key=XXXXXXXXXXXXXXXXXXX&method=flickr.photos.search&per_page=50&format=json&nojsoncallback=1&extras=%2Curl_m,url_h,date_taken

2 个答案:

答案 0 :(得分:2)

这3行:

let curl = "%2Curl_m"
print(curl)
return flickrURL(method: .RecentPhotos, page: nextPage, parameters: ["extras": "\(curl),url_h,date_taken"])

快速查看Flickr API告诉我,extras参数中的有效值不是url_m

%2C是逗号(,)的百分比编码形式。 NSURLQueryItem认为您的意思是字符串%2C,因此它会将%符号编码为%25。这就是你如何获得%252Curl_m

我不知道你在哪里拿到%2C。是否使用了Web实用程序并错误地包含了逗号?

答案 1 :(得分:0)

当您的网址被翻译成字符串时,某些字符会被转义为%转换为%25等等... 您可以使用stringByRemovingPercentEncoding获取非转义字符串。

print("%252".stringByRemovingPercentEncoding!) // prints "%2"