Я столкнулся с ошибкой при выполнении запроса POST API: «Ошибка анализа JSON»

Я новичок в 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)")
    }

Ответ, который вы получаете, явно представляет собой HTML, а не JSON, который объясняет ошибку, поэтому вопрос больше в том, почему вы получаете этот ответ об ошибке от сервера. У вас есть переменная headerData, которую вы создаете, но я не вижу, что вы ее используете. Возможно, ее следует добавить в headers?

Joakim Danielson 11.04.2024 15:46

Я уже исправил проблему, но все равно благодарю вас за ваше предложение. Я неправильно передал заголовок, и мой сервер ожидал тело в зашифрованном виде.

Manish kumar 16.04.2024 18:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой сервер ожидал зашифрованные данные, поэтому я получал ошибку сервера 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()
    }
    
    
    
}

Другие вопросы по теме