ios - 在swift中将参数数组作为请求主体传递

标签 ios json swift

我正在尝试传递一个如下所示的参数数组:

{
   "watermarks": [
       {
            "email" : "correo_user",
            "event_type" : "app",
            "watermark" : "marcaAgua",
            "date" : "date",
            "location" : "location",
            "segment" : 1,
            "time" : "time",
            "country" : "country",
            "city" : "city"
       }
   ]
}

我不知道如何将它作为对象数组传递,因为我以前从未这样做过。这是我目前使用的代码:

func marcaAgua(parameters: [String: Any],
                   completion: @escaping (Result<[MarcaAguaResData], Error>)-> Void) {
        
        let urlString =  baseUrl + "events"
        
        guard let url = URL(string: urlString) else {
            completion(.failure(NetworkingError.badUrl))
            return
        }
        
        var request = URLRequest(url: url)
        
        request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)
        request.httpMethod = "POST"
        request.setValue("Bearer \(token_login)", forHTTPHeaderField: "Authorization")
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        let session = URLSession.shared
        
        let task = session.dataTask(with: request) { (data, response, error) in
            DispatchQueue.main.async {
                guard let unwrappedResponse = response as? HTTPURLResponse else {
                    completion(.failure(NetworkingError.badResponse))
                    return
                }
                
                switch unwrappedResponse.statusCode {
                case 200 ..< 300:
                    print("success")
                default:
                    print("failure")
                }
                
                if let unwrappedError = error {
                    completion(.failure(unwrappedError))
                    return
                }
                
                if let unwrappedData = data {
                    
                    print("QQQQQ")
                    print(unwrappedData)
                    
                    do{
                        let json = try JSONSerialization.jsonObject(with: unwrappedData, options:.allowFragments)

                        if let successRes = try? JSONDecoder().decode([MarcaAguaResData].self, from: unwrappedData){
                            completion(.success(successRes))
                        }else{

                            let errorResponse = try JSONDecoder().decode([MarcaAguaErrorResponse].self, from: unwrappedData)
                            print("Error \(errorResponse)")
                            completion(.failure(errorResponse as! Error))
                        }
                    }catch{
                        print("AAA")
                        completion(.failure(error))
                    }
                }
            }
        }
        task.resume()
    }

当我在调用函数时将参数传递给函数时,我将它们作为 [String:Any] 类型的字典传递。这是一个例子:

let signupQueryData : [String : Any] = [
            "watermarks": [
                "email" : correo_user as String,
                "event_type" : "app" as String,
                "watermark" : marcaAgua as String,
                "date" : "\(dateActual) \(hour):\(minutes)" as String,
                "location" : latitudYLongitud as String,
                "segment" : 1 as Int,
                "time" : "\(hour):\(minutes)" as String,
                "country" : "\(qlq)" as String,
                "city" : "Caracas" as String
            ]
        ]

这是它在函数 marcaAgua 中打印的参数:

["watermarks": ["time": "22:10", "segment": 1, "location": "location", "email": "mail", "event_type": "app", "watermark": "e356eaadcb3aa4a1049441fc48d83a22", "date": "13.07.2021 22:10", "country": "Venezuela", "city": "Caracas"]]

当我这样做时,出现以下错误:

failure(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})

最佳答案

尝试这样做

func marcaAgua(parameters: [String: Any],
                   completion: @escaping (Result<[MarcaAguaResData], Error>)-> Void) {
        
        let urlString =  baseUrl + "events"
        
        guard let url = URL(string: urlString) else {
            completion(.failure(NetworkingError.badUrl))
            return
        }
        
    var request = URLRequest(url: url)
    request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)
    request.httpMethod = "POST"
    request.setValue("Bearer \(token_login)", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let session = URLSession.shared
    
    let task = session.dataTask(with: request) { (data, response, error) in
        DispatchQueue.main.async {
            guard let unwrappedResponse = response as? HTTPURLResponse else {
                completion(.failure(NetworkingError.badResponse))
                return
            }
            
            switch unwrappedResponse.statusCode {
            case 200 ..< 300:
                print("success")
            default:
                print("failure")
            }
            
            if let unwrappedError = error {
                completion(.failure(unwrappedError))
                return
            }
            
            if let unwrappedData = data {
                do{
                    let json = try JSONSerialization.jsonObject(with: unwrappedData, options:.allowFragments)
                    
                    if let successRes = try? JSONDecoder().decode([MarcaAguaResData].self, from: unwrappedData){
                        completion(.success(successRes))
                    }else{
                        
                        let errorResponse = try JSONDecoder().decode([MarcaAguaErrorResponse].self, from: unwrappedData)
                        completion(.failure(errorResponse as! Error))
                    }
                }catch{
                    completion(.failure(error))
                }
            }
        }
    }
    task.resume()
}

关于ios - 在swift中将参数数组作为请求主体传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68356483/

相关文章:

ios - iOS 设备之间的 TCP 连接

ios segue 消除部分 curl - 触摸 curl 以消除时称为什么?

iphone - 移除行为异常的 objectAtIndex

iphone - 跨类声明错误?

java - org.json.JSONObject 可以生成 {"und":[ {"value" :"some@one.com"}]}?

java - 如何判断一个 JSON 模式与 Java 中的另一个模式兼容?

ios - 应用程序购买对话中的旧样式

iOS 更改在 for 循环中创建的 UIButton 中的颜色

jquery - 如果可能,使用 AJAX 从 URL 获取 JSON 数据

Swift:如何访问 AppDelegate 中的 navigationController