我对使用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
答案 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"