Google画像検索APIをiOSで利用する - Qiita
https://qiita.com/ukandori/items/234156f97eb6dad77966
などの先人を参考に。Codableや新しいreduceURLComponentsを使ったらだいぶシンプルになりました。
(追記)コメントを受けて、URLComponentsに書き替えました。こちらのほうがStringでやるより適切ですね。
// Structure defined by https://developers.google.com/custom-search/json-api/v1/reference/cse/list#response
struct CustomSearchedResult: Codable {
struct Item: Codable {
struct Image: Codable {
let contextLink: String
let thumbnailLink: String
let thumbnailHeight: Int
let thumbnailWidth: Int
}
let link: URL
let displayLink: URL
let mime: String
let image: Image
}
let items: [Item]
}
let query = "ほげほげ"
var urlComponents = URLComponents(string: "https://www.googleapis.com/customsearch/v1")!
urlComponents.queryItems = [
URLQueryItem(name: "searchType", value: "image"),
URLQueryItem(name: "q", value: query),
// To get `key`, create your own project from https://console.developers.google.com/projectcreate
URLQueryItem(name: "key", value: "xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"),
// To get `cx`, create your own search engine from https://cse.google.com/cse/create/new
URLQueryItem(name: "cx", value: "000000000000000000000:xxxxxxxxxxx")
]
print(urlComponents.string!)
let task = URLSession.shared.dataTask(with: urlComponents.url!) { data, response, error in
guard let jsonData = data else {
print(error as Any)
return
}
do {
let result = try JSONDecoder().decode(CustomSearchedResult.self, from: jsonData)
print(result.items[0])
let task = URLSession.shared.dataTask(with: result.items[0].link) {data, response, error in
guard let image = data.flatMap(UIImage.init) else {
print(error as Any)
return
}
// imageとれた
}
task.resume()
} catch(let e) {
print(e)
}
}
task.resume()