import SwiftUI
struct PostRequestScreen: View {
@State private var responseText = ""
var body: some View {
VStack(spacing: 20) {
Text("Post Request Screen")
.font(.title)
Button("Send POST Request") {
sendPostRequest()
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
Text("Response:")
.font(.headline)
.frame(maxWidth: .infinity, alignment: .leading)
ScrollView {
Text(responseText)
.font(.body)
.frame(maxWidth: .infinity, alignment: .leading)
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(8)
}
Spacer()
}
.padding()
}
func sendPostRequest() {
guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else {
responseText = "Invalid URL"
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]
do {
let jsonData = try JSONSerialization.data(withJSONObject: jsonBody)
request.httpBody = jsonData
} catch {
responseText = "Failed to encode JSON body"
return
}
let task = URLSession.shared.dataTask(with: request) { data, response, error in
DispatchQueue.main.async {
if let error = error {
responseText = "Error: \(error.localizedDescription)"
return
}
guard let data = data else {
responseText = "No data received"
return
}
if let jsonString = String(data: data, encoding: .utf8) {
responseText = jsonString
} else {
responseText = "Failed to decode response"
}
}
}
task.resume()
}
}
struct PostRequestScreen_Previews: PreviewProvider {
static var previews: some View {
PostRequestScreen()
}
}
This solution creates a SwiftUI screen with a button labeled 'Send POST Request'. When the button is tapped, it calls sendPostRequest().
Inside sendPostRequest(), it builds a URLRequest with the POST method and sets the Content-Type header to application/json. It creates a dictionary with the required keys and converts it to JSON data.
The request is sent asynchronously using URLSession.shared.dataTask. When the response arrives, it updates the responseText state on the main thread to show the JSON response or an error message.
This approach keeps the UI responsive and clearly shows the server response below the button.