LoginSignup
1
2

More than 3 years have passed since last update.

YoutubeAPIを使用してJSON形式の情報をXcodeで扱う方法

Posted at

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=
へアクセス

7a26467c2a73e4cc837296144a2b07ce.png

私の画面だとハンバーガーメニューの右側のGoogole Cloud Platformの右のYoutubeAppのタブから作成できる。
その後
+認証情報の作成
というタブをクリックしてAPIキーを発行する
このAPIキーはYoutubeAPIへリクエストを投げる時にクエリパラメータとして渡す値で
文字通り鍵(認証)に役割を果たす。
では試しに。
https://www.googleapis.com/youtube/v3/search?q=任意の文字&key=取得したキー&part=snippet

というURLへアクセスすると
8de037f135ce0a24464267d874a09c27.jpeg

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に割り当てたり似たり焼いたりお好みに

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2