YoutubeAPIを使用してみよう
YoutubeAPIを使用してJson形式の情報を扱えるようにするには以下の手順で作業を行う
1:YoutubeAPIを使用でできるよにプロジェクトの作成、とAPIキーを作成するconsole.cloud.google.com
2:Xcodeで対象のJSON形式に対応したmodelを作成する
3:APIへリクエストを投げる
4:レスポンス情報をmodel型のオブジェクトへデコードする
まずは、APIキーの作成をするためにhttps://developers.google.com/youtube/v3/getting-started?hl=ja
へアクセスして
作業を始める前に
という項目の手順よりGoogleアカウントが無ければ作成
https://console.cloud.google.com/apis/credentials?hl=ja&project=youtubeapp-311106&folder=&organizationId=
へアクセス
私の画面だとハンバーガーメニューの右側のGoogole Cloud Platformの右のYoutubeAppのタブから作成できる。
その後
+認証情報の作成
というタブをクリックしてAPIキーを発行する
このAPIキーはYoutubeAPIへリクエストを投げる時にクエリパラメータとして渡す値で
文字通り鍵(認証)に役割を果たす。
では試しに。
https://www.googleapis.com/youtube/v3/search?q=任意の文字&key=取得したキー&part=snippet
JSONファイルがレスポンスとして返ってくる。
要はこれをXcodeで扱えるようにする事ができればいい。
そのために
alamofireというライブラリを使用する。
このライブラリはhttp通信のためのライブラリ
cocoapodでライブラリをプロジェクトにインストールする。
テストコード
デフォルトのストーリーボードに紐付けられているViewControllerでテストコードを書いてみるimport UIkit
import Alamofire
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
//リクエスト URL
let urlString = "https://www.googleapis.com/youtube/v3/search?q=検索したいワード&key=APIキー&part=snippet"
//リクエストを作成
let request = AF.request(urlString)
//リクエストをyoutubeApiに投げてレスポンス情報を取得
request.responseJSON{(response) in
do{
//Json情報を取得して対象のモデルオブジェクトへ変換
guard let data = response.data else { return }
let decode = JSONDecoder()
let video = try decode.decode(Video.self, from: data)
print("video:", video.items.count)
} catch {
print("変換に失敗しました\(error)")
}
print("response", response)
}
}
}
modelはこのように
import Foundation
class Video: Decodable {
let kind: String
let items: [Item]
}
class Item: Decodable {
let snippet: Snippet
}
class Snippet: Decodable {
let publishedAt: String
let channelId: String
let title: String
let description: String
let thumbnails: Thumbnail
}
class Thumbnail: Decodable {
let medium: ThumbnailInfo
let high: ThumbnailInfo
}
class ThumbnailInfo: Decodable {
let url: String
let width: Int?
let height: Int?
}
Json形式の情報をデコードするには変数名を一致させる必要があり、配列に対しては上記のように
クラスを作成して入れる情報をクラスで扱えるようにする。
例えば、レスポンスとして返ってきたjson情報には
Itemという配列がある。この配列の中には更にkindやidなどの変数や、snippetなどの配列がある
この配列の中に入っている情報一つの型(クラス)で扱う。
結果として一つのvideoクラスのインスタンスが作成され、
その中のItemという変数名の配列にjson情報のItem配列の各要素が格納される
ちなみに、json情報の全ての要素を格納する変数を用意しなくても取り出したい情報だけ用意しておけばいい。
逆に、json情報にない情報を格納する変数がモデルオブジェクトで宣言されているとエラーとなる。
あと生成したオブジェクトの情報を使って、imageURLから画像をダウンロードしたり、文字列を labelに割り当てたり似たり焼いたりお好みに