[Swift4]SwiftでHTTP GETをする方法

Posted on

bitflyerから現在のbitcoinの価格を取得してみました。

var components = URLComponents("https://lightning.bitflyer.jp/ticker")
        components?.queryItems = [URLQueryItem(name:"product_code",value:"BTC_JPY")]
        let url = components?.url
        let task = URLSession.shared.dataTask(with: url!){
            data,response,error in
            if let data = data, let response = response {
                print(response)
                do{
                    let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)
                    print(json)

                }catch{
                    print("Serivalize Error")
                }
            }else{
                print(error ?? "Error")
            }
        }
        task.resume()
  • URLComponents

URLクエリストリングを付けてくれる構造体

components?.queryItems = [URLQueryItem(name:"product_code",value:"BTC_JPY")]
let url = components?.url

let url = URL(string:"https://lightning.bitflyer.jp/ticker?product_code=BTC_JPY")

は恐らく同じ意味。 queryItemsで追加できた方が取り回しし易いので便利

  • URLSession.shared.dataTask(with: url!)

    • URLSession
    • 通信タスクの管理クラス
      • sharedはシングルトンのインスタンス取得. 普通はこっち、cookieとかの設定をしたい場合にはinitして生成するイメージ
    • datataskはデータ取得のタスク
      • dataTask(with:completionHandler:)の第二引数的に(with: url!){・・・}みたいに補完されるけど、これは何? (with: url!,completionHandler:{・・・})じゃないの? Trailing Closureという書き方らしい。最後の引数がクロージャだとこうやって書けるよ。と どうせ書く時は補完してくれるし、completionHandler:付けてたほうが見る人は理解し易いのでは?という気持ちがあるけど、脳が慣れれば自然になるのでしょう。 swiftって「label絶対つけろよ。わかりやすいだろ!」という感じかと思っていたのだけど、実際のところ_ がよく使われてたり、省略も増える傾向になっている気がする。
  • JSONSerialization.jsonObject

JSONからArrayとかDictionaryに変換する

class func jsonObject(with data: Data,
              options opt: JSONSerialization.ReadingOptions = []) throws -> Any

bytebufferの普通のデータを入れる関数と、InputStreamを入れる関数があるみたい InputStreamとは?わかっているようで使い所がよくわかっていない。要はinputを抽象化しているのだと思うのだけど、横道にそれるので今後の課題にしておく。

  • ReadingOptions
* static var mutableContainers: JSONSerialization.ReadingOptions
Specifies that arrays and dictionaries are created as mutable objects.
可変のオブジェクトとして、配列や辞書が作られるように指定

* static var mutableLeaves: JSONSerialization.ReadingOptions
JSONオブジェクトグラフの中のleaf stringをNSMutableStringインスタンスとして指定する
Specifies that leaf strings in the JSON object graph are created as instances of NSMutableString.

static var allowFragments: JSONSerialization.ReadingOptions
NSArrayかNSDictionaryのインスタンスではないトップレベルオブジェクトを許可する
Specifies that the parser should allow top-level objects that are not an instance of NSArray or NSDictionary.

ドキュメント読むとよくわからないが、どうやら、 全部可変 Stringが可変 不変 という意味らしい。基本はallowFragmentsで良さそう。今のところ困らないけど、いつか躓いた時に覚えるでしょう。

  • task.resume()

リクエストの実行