We use POST requests with JSON body to send data from your app to a server. This helps you save or update information online.
POST request with JSON body in iOS Swift
let url = URL(string: "https://example.com/api")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let json: [String: Any] = ["key": "value"] let jsonData = try? JSONSerialization.data(withJSONObject: json) request.httpBody = jsonData let task = URLSession.shared.dataTask(with: request) { data, response, error in // handle response here } task.resume()
Set the HTTP method to "POST" to tell the server you want to send data.
Set the "Content-Type" header to "application/json" to specify the data format.
var request = URLRequest(url: URL(string: "https://api.example.com/login")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let body = ["username": "user1", "password": "pass123"] request.httpBody = try? JSONSerialization.data(withJSONObject: body)
var request = URLRequest(url: URL(string: "https://api.example.com/tasks")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let taskData = ["title": "Buy milk", "done": false] as [String : Any] request.httpBody = try? JSONSerialization.data(withJSONObject: taskData)
This example sends a POST request with a JSON body to a test API. It prints the server's JSON response in the console.
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() sendPostRequest() } func sendPostRequest() { guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return } var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let jsonBody: [String: Any] = ["title": "foo", "body": "bar", "userId": 1] request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error: \(error.localizedDescription)") return } guard let data = data else { print("No data received") return } if let responseJSON = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { print("Response JSON: \(responseJSON)") } } task.resume() } }
Always set the Content-Type header to "application/json" when sending JSON data.
Use URLSession's dataTask to send the request asynchronously.
Handle errors and check the response to know if the request succeeded.
POST requests send data to a server, often to create or update something.
JSON is a common format to send structured data in the request body.
Set the HTTP method and headers correctly to make the server understand your data.
Practice
Solution
Step 1: Understand HTTP methods
POST requests are used to send data to a server, often to create or update something.Step 2: Recognize JSON role
JSON is a format to structure the data sent in the body of the POST request.Final Answer:
To send data to a server, usually to create or update resources -> Option AQuick Check:
POST sends data = A [OK]
- Confusing POST with GET method
- Thinking POST is for deleting data
- Ignoring the role of JSON in the body
Solution
Step 1: Set HTTP method correctly
The property to set HTTP method in URLRequest is httpMethod and it expects a String like "POST".Step 2: Add JSON Content-Type header properly
Use setValue(_:forHTTPHeaderField:) with "application/json" for the "Content-Type" header.Final Answer:
request.httpMethod = "POST"\nrequest.setValue("application/json", forHTTPHeaderField: "Content-Type") -> Option AQuick Check:
Correct method and header syntax = A [OK]
- Using wrong property names like method or setHeader
- Forgetting quotes around "POST"
- Using incorrect header field names or values
let url = URL(string: "https://example.com/api")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let jsonBody = ["name": "Alice", "age": 30] as [String : Any]
request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody)
print(String(data: request.httpBody!, encoding: .utf8)!)Solution
Step 1: Serialize dictionary to JSON data
JSONSerialization.data converts the dictionary to JSON data bytes representing {"name":"Alice","age":30}.Step 2: Convert data to UTF-8 string
Printing the data as UTF-8 string shows the JSON string without brackets or Optional wrapper.Final Answer:
{"name":"Alice","age":30} -> Option BQuick Check:
JSONSerialization outputs JSON string = B [OK]
- Expecting Swift dictionary syntax instead of JSON string
- Printing Optional wrapper
- Forgetting to unwrap data or encoding
var request = URLRequest(url: URL(string: "https://api.example.com")!) request.httpMethod = "POST" let json = ["key": "value"] request.httpBody = try? JSONSerialization.jsonObject(with: json)
Solution
Step 1: Check JSON serialization method
jsonObject(with:) parses JSON data to object; to create JSON data from object, use data(withJSONObject:).Step 2: Confirm other parts
Content-Type header missing is an issue but not the main error causing failure here.Final Answer:
Using JSONSerialization.jsonObject instead of data(withJSONObject:) -> Option CQuick Check:
Wrong JSON method used = D [OK]
- Confusing jsonObject(with:) with data(withJSONObject:)
- Forgetting Content-Type header
- Incorrect URLRequest initialization
Solution
Step 1: Understand conditional dictionary update
var jsonBody = ["name": "Bob"] if !email.isEmpty { jsonBody["email"] = email } request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) creates a mutable dictionary and adds "email" only if not empty, which is correct.Step 2: Check other options for errors
let jsonBody = ["name": "Bob", "email": email.isEmpty ? nil : email] request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) uses nil in dictionary literal which is invalid; var jsonBody = ["name": "Bob", "email": email] if !email.isEmpty { jsonBody.removeValue(forKey: "email") } request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) uses inverted condition, removing email when it is not empty, incorrect; let jsonBody = ["name": "Bob"] if email != "" { jsonBody["email"] = email } request.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) tries to mutate immutable dictionary.Final Answer:
var jsonBody = ["name": "Bob"]\nif !email.isEmpty {\n jsonBody["email"] = email\n}\nrequest.httpBody = try? JSONSerialization.data(withJSONObject: jsonBody) -> Option DQuick Check:
Mutable dict + conditional add = C [OK]
- Using let dictionary and trying to mutate it
- Including nil values in dictionary literal
- Adding then removing keys instead of conditional add
Ready to prove it?
Pass the test and this pattern moves unknown
