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
ディズニーランドのある Anaheim 市の税率 0.0775 (7.75%) が取得できました。
以上、Swift で URLSession を使って、HTTP のリクエスト (GET) する方法をご説明しました。