Я новичок в SwiftUI, и у меня возникли проблемы с публикацией запроса API. Я все проверил, но все равно получаю сообщение об ошибке сервера 500. Я застрял на этом, пожалуйста, помогите, если возможно
Данные ответа:
<!doctype html>
<html lang = "en">
<head>
<title>Server Error (500)</title>
</head>
<body>
<h1>Server Error (500)</h1><p></p>
</body>
</html>
Ошибка анализа JSON: Error Domain=NSCocoaErrorDomain Code=3840 «Неверный значение вокруг строки 2, столбец 0." UserInfo = {NSDebugDescription=Invalid значение вокруг строки 2, столбец 0., NSJSONSerializationErrorIndex=1}
Мой код:
do{
// Define the data to be sent
let data: [String: String] = [
"ad_id": "00000000-0000-0000-0000-000000000000",
"device_id": "EE07C4CF-53CB-49D7-9991-111111111111",
"device_token": "NOTFOUND"
]
let encoder = JSONEncoder()
// Convert the data dictionary to JSON data using JSONEncoder
let jsonData = try encoder.encode(data)
// Define the User-Agent header value
let userAgentHeader = ["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"]
// Convert User-Agent header dictionary to JSON string
guard let headerData = try? JSONSerialization.data(withJSONObject: userAgentHeader, options: []),
let headerJSON = String(data: headerData, encoding: .utf8) else {
print("Failed to convert User-Agent header dictionary to JSON string")
return
}
// Create the request
var request = URLRequest(url: url)
request.httpMethod = "POST"
// Define the headers dictionary
let headers: [String: String] = [
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
]
// Add the headers to the request
for (key, value) in headers {
request.setValue(value, forHTTPHeaderField: key)
}
request.httpBody = jsonData
if let reqString = String(data: jsonData, encoding: .utf8) {
print("paramater data: \(reqString)")
}
// Perform the request using URLSession
URLSession.shared.dataTask(with: request) { data, response, error in
// Handle the response
if let error = error {
print("Error: \(error)")
return
}
// Handle the data
guard let data = data else {
print("No data received")
return
}
// Print the data as a string to see what you received
if let responseString = String(data: data, encoding: .utf8) {
print("Response data: \(responseString)")
}
// Parse the response data
do {
// Try parsing the JSON with allowFragments option
let json = try JSONSerialization.jsonObject(with: data, options: [.mutableContainers, .allowFragments])
print("Response JSON: \(json)")
} catch {
print("Error parsing JSON: \(error)")
}
}.resume()
} catch {
// Handle the encoding error
print("Error encoding data to JSON: \(error)")
}
Я уже исправил проблему, но все равно благодарю вас за ваше предложение. Я неправильно передал заголовок, и мой сервер ожидал тело в зашифрованном виде.
Мой сервер ожидал зашифрованные данные, поэтому я получал ошибку сервера 500. Я исправил проблему и вот мой код для публикации запроса API:
func callGuestAPI() async {
// Define the URL
guard let url = URL(string: "https://your-base-url") else {
return print("URL Error")
}
// Define the data to be sent
let data: [String: String] = [
"ad_id": "00000000-0000-0000-0000-000000000022",
"device_id": "EE07C4CF-53CB-49D7-9999-1AB613EEF222",
"device_token": "NOTFOUND"
]
//JSON Encoder
let encoder = JSONEncoder()
// Create the request
var request = URLRequest(url: url)
request.httpMethod = "POST"
//Request Body
guard let msgString = convertDictionaryToJSONString() else {
return print("JSON Conversion error")
}
print("msgString \(msgString)") //not encrypted body
// Encrypted Request body
guard let jsonData: String = encrypt(msgString: msgString) else {
return print("Encryption error")
}
print("jsonData \(jsonData)") //encrypted body
// Define the headers dictionary
let headers: [String: String] = [
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
]
// Add the headers to the request
request.allHTTPHeaderFields = headers
print("headers \(headers)")
// Converting String body to Data
guard let withoutEncryptedBody = msgString.data(using: .utf8) else {
return print("Invalid body")
}
request.httpBody = withoutEncryptedBody
print("encryptedBody \(withoutEncryptedBody)")
// Perform the request using URLSession
do{
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if let data = data {
let str = String(data: data, encoding: .utf8)
print("URLSession Received data:\n\(str ?? "")")
}
}
task.resume()
}
}
Ответ, который вы получаете, явно представляет собой HTML, а не JSON, который объясняет ошибку, поэтому вопрос больше в том, почему вы получаете этот ответ об ошибке от сервера. У вас есть переменная
headerData
, которую вы создаете, но я не вижу, что вы ее используете. Возможно, ее следует добавить вheaders
?