iTuneStoreのWeb serviceであるSearch APIを使ってみた
iTuneStoreのWeb serviceであるSearch APIを使ってみた。
しっかりとした仕様書を以下に発見したので、これに従って、swiftベースでNSURLSessionで Search APIをコールし、JSON形式のレスポンスを受信し、tableViewに検索結果として表示する実装をしてみた。
iTunes, App Store, iBooks, and Mac App Store Affiliate Resources - Search API
Step1. 以下のような感じで、検索キーワード(SearchText)と、検索対象(entity)を指定してURLを構築する。なお、SearchTest中にスペースを入れると飛んじゃうので、ちゃんとエスケープしないといけません。
-----コード抜粋------
func urlWithSearchText(searchText: String, category: Int) -> NSURL {
var entityName: String
switch category {
case 1: entityName = "musicTrack"
case 2: entityName = "software"
case 3: entityName = "ebook"
default: entityName = ""
}
let escapedSearchText =
searchText.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let urlString = String(format:
"http://itunes.apple.com/jp/search?term=%@&limit=200&entity=%@", escapedSearchText, entityName)
let url = NSURL(string: urlString)
return url!
}
-------------
Step2. 以下のような感じで、NSURLSessionを使って、URLをコールする。
Responseは、JSON形式なので、JSONに含まれるwrapperTypeに従い、それぞれのケースのparserを作成した。SearchResult Object Arrayに順番にappendしていき(parseDictionary内で実装)、最後にtableViewに反映する(reloadData内で実装)。
------コード抜粋-----
let session = NSURLSession.sharedSession()
dataTask = session.dataTaskWithURL(url, completionHandler: {
data, response, error in
println("Failure! (error)")
if error.code == -999 { return }
} else if let httpResponse = response as? NSHTTPURLResponse {
if httpResponse.statusCode == 200 {
if let dictionary = self.parseJSON(data) {
self.searchResults = self.parseDictionary(dictionary)
dispatch_async(dispatch_get_main_queue()) {
self.isLoading = false
self.tableView.reloadData()
}
return
}
} else {
println("Failure! (response)")
}
}
// UIのアップデートはメインスレッドでね!
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
self.showNetworkError()
}
})
dataTask?.resume()
------------
こんな感じにSwiftで検索すると、テイラースイフトだらけになった。
え!Objective-Cでは、NSURLSessionをそのまま使わず、AFNetworkingを使うのが主流なの?(ってエンジニアが言っていた気が。。。)
Swiftでは、Alamofireというlibraryがあることが分かった。ちなみにAFNetworkingを作った人と同じ人が作ったらしい。"AF"は、AlamofireのObjective-Cの命名規則に従った呼び方なんだな。この週末は、Alamofireを使って、通信周りをリファクタリングしてみようと思う。
以下に、参考になる資料発見。あー、週末が待ち遠しい。