Swift - URLSession で HTTP リクエスト (GET) する方法 - Rest API・JSON

ここでは、Swift で URLSession を使って、HTTP のリクエスト (GET) する方法をご説明します。

カリフォルニア州の税率が取得できる CDTFA Tax Rate API を使って、税率を取得してみます。

CDTFA Tax Rate API の説明

CDTFA Tax Rate API はカリフォルニア州が公開している、税率を取得できる API です。

住所を指定して税率を取得する方法と、緯度・経度を指定して税率を取得する方法がありますが、今回は緯度・経度を指定して税率を取得します。


Get Rate By Latitude and Longitude

https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude={longitude}&latitude={latitude}

{longitude} に経度、{latitude} に緯度を指定して、上記の URL に GET リクエストをすると、以下のようなレスポンスが返ってきます。

{
   "taxRateInfo":[
      {
         "rate":0.0775,
         "jurisdiction":"ANAHEIM",
         "city":"ANAHEIM",
         "county":"ORANGE",
         "tac":"300110370000"
      }
   ],
   "geocodeInfo":{
      "bufferDistance":50
   },
   "termsOfUse":"https://www.cdtfa.ca.gov/dataportal/policy.htm",
   "disclaimer":"https://www.cdtfa.ca.gov/dataportal/disclaimer.htm"
}

URLSession で HTTP リクエスト (GET) する方法

それでは、Swift で URLSession を使って HTTP リクエスト (GET)する方法をご説明します。

以前「iOS アプリで現在地情報を取得する方法 (Swift)」で緯度・経度を取得するアプリを作ったので、ここでは 緯度・経度 が取得できている前提で、緯度・経度をハードコードして、CDTFA Tax Rate API を使って、税率を取得します。

ロサンゼルスにあるディズニーランドの緯度と経度を使います。


GET リクエストをして、ディズニーランドあたりの税率を取得するコードは以下の通りです。

import Foundation

let longitude = -117.91966085189185
let latitude = 33.819508122999984

let url = URL(string: "https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude=\(longitude)&latitude=\(latitude)")!

var request = URLRequest(url: url)
request.httpMethod = "GET"

URLSession.shared.dataTask(with: request) {(data, response, error) in
    
    if let error = error {
        print("Unexpected error: \(error.localizedDescription).")
        return;
    }
    
    if let response = response as? HTTPURLResponse {
        if !(200...299).contains(response.statusCode) {
            print("Request Failed - Status Code: \(response.statusCode).")
            return
        }
    }
    
    if let data = data {
        do {
            let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            let taxRateInfos = jsonDict?["taxRateInfo"] as? [[String: Any]]
            if taxRateInfos != nil && taxRateInfos!.count > 0 {
                let taxRateInfo = taxRateInfos?[0] as? [String: Any]
                let rate = taxRateInfo?["rate"]
                let city = taxRateInfo?["city"]
                
                print("City: \(city ?? ""), Tax Rate: \(rate ?? "")")
            }
        } catch {
            print("Error")
        }
    } else {
        print("Unexpected error.")
    }
    
}.resume()

それでは、コードを順を追ってご説明します。

let url = URL(string: "https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByLngLat?longitude=\(longitude)&latitude=\(latitude)")!

var request = URLRequest(url: url)
request.httpMethod = "GET"

6 行目では、緯度・経度を含めた、CDTFA Tax Rate API の URL を生成しています。

8 ~ 9 行目で URL から URLRequest オブジェクトを生成し、httpMethod に GET を指定しています。


URLSession.shared.dataTask(with: request) {(data, response, error) in

11 行目からが、URLSession の dataTask() で「リクエストの送信・レスポンスの受け取り・その後の処理」をタスクとして定義している箇所です。

先ほど生成した request を with で渡しています。

data にはサーバーから送られてきたデータが、response にはレスポンスの HTTP ヘッダーやステータスコードなどのレスポンスのメタデータが、error にはリクエストが失敗した時のみ、失敗した理由が入っています。


if let error = error {
    print("Unexpected error: \(error.localizedDescription).")
    return;
}

error に値が入っている時は、そのエラーを print して return しています。


if let response = response as? HTTPURLResponse {
    if !(200...299).contains(response.statusCode) {
        print("Request Failed - Status Code: \(response.statusCode).")
        return
    }
}

ここでは、response を HTTPURLResponse にキャストして、レスポンスのステータスコードをチェックしています。

200 番台(Success) ではない時はステータスコードを print して return しています。


if let data = data {
    do {
        let jsonDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        let taxRateInfos = jsonDict?["taxRateInfo"] as? [[String: Any]]
        if taxRateInfos != nil && taxRateInfos!.count > 0 {
            let taxRateInfo = taxRateInfos?[0] as? [String: Any]
            let rate = taxRateInfo?["rate"]
            let city = taxRateInfo?["city"]
            
            print("City: \(city ?? ""), Tax Rate: \(rate ?? "")")
        }
    } catch {
        print("Error")
    }
} else {
    print("Unexpected error.")
}

そして、レスポンスで受け取ったデータから、rate と city を取得して print しています。

詳しくは「Swift で Dictionary を使って JSON からデータを抽出する」でご説明しています。


}.resume()

最後に resume() メソッドで定義したタスクをスタートしています。


これを playground で実行すると以下のようになります。

City: ANAHEIM, Tax Rate: 0.0775

Swift - URLSession で HTTP リクエスト (GET) する方法 1

ディズニーランドのある Anaheim 市の税率 0.0775 (7.75%) が取得できました。


以上、Swift で URLSession を使って、HTTP のリクエスト (GET) する方法をご説明しました。

© 2024 iOS 開発入門