Balbas Code

SwiftでAPIリクエストを簡単に扱う方法: GETとPOSTの実装

公開日: 2023-11-07 22:18:42

Swiftを用いてAPIリクエストを送信し、レスポンスを受け取る基本的なプロセスをまとめました。
業務で使う以上は他にもいろんな書き方を知っていた方がいいのですが、とりあえず1つ!!!



POST通信サンプル


import Foundation

// 1. POSTするデータを設定します。
let parameters = ["key1": "value1", "key2": "value2"]

// 2. リクエストするURLを指定します。
guard let url = URL(string: "https://api.example.com/data") else {
print("Invalid URL")
return
}

// 3. URLRequestオブジェクトを作成します。
var request = URLRequest(url: url)

// 4. リクエストのHTTPメソッドをPOSTに設定します。
request.httpMethod = "POST"

// 5. JSON形式でデータをHTTPボディに設定します。
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
print("Error: Cannot create JSON from parameters")
return
}

// 6. URLSessionを使用してデータタスクを作成します。
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// 10. エラーがあれば、その内容を出力します。
if let error = error {
print("Error: \(error.localizedDescription)")
return
}

// 11. HTTPステータスコードを確認します。
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 200 {
print("HTTP Status Code: \(httpResponse.statusCode)")
return
}

// 12. データがnilでないことを確認し、データがあればJSONとしてパースします。
guard let data = data else {
print("No data")
return
}

do {
// 13. JSONデータをデコードします。
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
// 14. JSONの結果を出力します。
print("JSON Response: \(jsonResult)")
}
} catch {
// 15. エラーを捕捉したら、その内容を出力します。
print("JSON Error: \(error.localizedDescription)")
}
}

// 7. データタスクを開始します。
task.resume()

// 8. コンソール出力を確認するために、メインスレッドが終了しないようにする。
RunLoop.main.run()


  1. 送信するパラメータをJSONエンコード可能な辞書として定義します。

  2. 使用するAPIのURLを指定します。

  3. URLRequestオブジェクトを作成します。

  4. リクエストのHTTPメソッドをPOSTに設定します。

  5. HTTPヘッダーにコンテンツタイプとしてapplication/jsonを指定し、HTTPボディにJSONデータを設定します。

  6. URLSessionを使用して、作成したリクエストを使用してデータタスクを作成します。

  7. task.resume()を呼び出すことで、非同期のHTTP POSTリクエストをサーバーに対して開始します。

  8. コンソール出力を確認するために、メインスレッドが終了しないようにします。





POSTリクエストの場合、サーバーにデータを送信してレスポンスを受け取った後、非同期で以下の処理が行われます:



  • エラーが存在するかチェックします。もしエラーがあれば、その内容を出力し処理を終了します。

  • HTTPURLResponseをチェックしてHTTPステータスコードが200(成功)かどうかを確認します。異なるステータスコードの場合は、エラーを出力し処理を終了します。

  • dataがnilでないことを確認し、受け取ったデータがあれば、それをJSONとして解析しようと試みます。

  • JSON解析に成功したら、その内容を出力します。

  • JSON解析に失敗した場合は、エラーを出力します。


 




GET通信サンプル


import Foundation

// 1. クエリパラメーターをURLの一部としてエンコードします。
var urlComponents = URLComponents(string: "https://api.example.com/data")!
let queryItems = [URLQueryItem(name: "key1", value: "value1"), URLQueryItem(name: "key2", value: "value2")]
urlComponents.queryItems = queryItems

// 2. エンコードされたURLを取得します。
guard let url = urlComponents.url else {
print("Invalid URL")
return
}

// 3. URLRequestオブジェクトを作成します。
var request = URLRequest(url: url)

// 4. リクエストのHTTPメソッドをGETに設定します(デフォルトがGETなので、省略も可能です)。
request.httpMethod = "GET"

// 5. URLSessionを使用してデータタスクを作成します。
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// 8. エラーがあれば、その内容を出力します。
if let error = error {
print("Error: \(error.localizedDescription)")
return
}

// 9. HTTPステータスコードを確認します。
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 200 {
print("HTTP Status Code: \(httpResponse.statusCode)")
return
}

// 10. データがnilでないことを確認し、データがあればJSONとしてパースします。
guard let data = data else {
print("No data")
return
}

do {
// 11. JSONデータをデコードします。
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
// 12. JSONの結果を出力します。
print("JSON Response: \(jsonResult)")
}
} catch {
// 13. エラーを捕捉したら、その内容を出力します。
print("JSON Error: \(error.localizedDescription)")
}
}

// 6. データタスクを開始します。
task.resume()

// 7. コンソール出力を確認するために、メインスレッドが終了しないようにする。
RunLoop.main.run()

 



  1. URLComponentsを使用して、クエリパラメーターをエンコードします。

  2. 正しいURLを取得します。

  3. URLRequestオブジェクトを作成します。

  4. リクエストのHTTPメソッドをGETに設定します。

  5. URLSessionを使用してデータタスクを作成します。

  6. task.resume()を呼び出すことで、非同期のHTTP GETリクエストをサーバーに対して開始します。

  7. コンソール出力を確認するために、メインスレッドが終了しないようにします。


 



GETリクエストの場合、サーバーにリクエストを送信してレスポンスを受け取った後、非同期で以下の処理が行われます:



  • エラーが存在するかチェックします。もしエラーがあれば、その内容を出力し処理を終了します。

  • HTTPURLResponseをチェックしてHTTPステータスコードが200(成功)かどうかを確認します。異なるステータスコードの場合は、エラーを出力し処理を終了します。

  • dataがnilでないことを確認し、受け取ったデータがあれば、それをJSONとして解析しようと試みます。

  • JSON解析に成功したら、その内容を出力します。

  • JSON解析に失敗した場合は、エラーを出力します。