Working with JSON APIs is a fundamental part of modern iOS app development. One of the most efficient ways to call web APIs in Swift is by using the URLSession class, which provides an API for downloading data from and uploading data to endpoints over the network.

In this article, we’ll explore how to use URLSession to send HTTP requests, handle JSON responses, and manage network tasks in a Swift-based iOS app.
What is URLSession?
URLSession is a class provided by Apple’s Foundation framework that allows you to create and manage network sessions. You can use it to send HTTP or HTTPS requests to a server, download files, upload data, and handle background network tasks efficiently.
Making a Simple JSON API Call
To begin with, you’ll need a valid API endpoint that returns JSON data. For example, an endpoint like https://jsonplaceholder.typicode.com/todos/1 returns JSON-formatted to-do data.
Here’s a basic Swift example:
import Foundation
struct Todo: Codable {
let id: Int
let title: String
let completed: Bool
}
func fetchTodo() {
guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1") else {
print("Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("Request failed with error: \(error)")
return
}
guard let data = data else {
print("No data returned")
return
}
do {
let todo = try JSONDecoder().decode(Todo.self, from: data)
print("Todo title: \(todo.title)")
} catch {
print("Decoding failed: \(error)")
}
}
task.resume()
}
This code defines a Todo struct conforming to Codable, makes an HTTP GET request, and decodes the response into the struct. It’s a clean, concise way to interact with APIs in Swift.
Handling Errors and Status Codes
When working with real-world APIs, it’s critical to handle errors, HTTP status codes, and edge cases. You can use the URLResponse object and cast it to HTTPURLResponse to check the status code:
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
// Success
} else {
print("Server returned status code: \(httpResponse.statusCode)")
}
}
Security and Performance Tips
- Use
HTTPSonly for secure data transmission. - Perform networking tasks on background threads.
- Always validate server responses and decode errors gracefully.
- Use a timeout interval or caching policy as required for performance optimization.
Conclusion
Swift makes it simple and powerful to interact with JSON APIs using URLSession. Whether you’re fetching data, sending updates, or performing background network tasks, URLSession is the go-to tool for network communication in iOS development.
For more advanced techniques such as using Combine or async/await with URLSession in Swift, check out this detailed Swift.org article:
👉 Swift Async Await Networking