首页 > 解决方案 > 在 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.})

标签: iosjsonswift

解决方案


initialise Variables

var invitationsArray = Array<[String: Any]>()
var invitations = Array<[String: Any]>()

Logic

    invitations = [["friend_id": "\(each.friendId!)", "invited_type": "friend"]]
                    invitationsArray.append(contentsOf: invitations)

Set variables

let params: [String: Any] = [
            "user_id":Global.shared.currentUserLogin.id,
            "ride_name": planARide.name!,
            "ride_description": planARide.description!,
            "ride_type": planARide.rideType!,
            "ride_date_and_time": planARide.rideDate!,
            "ride_city": planARide.city!,
            "ride_meeting_spot": planARide.rideMeetingSpot!,
            "ride_meeting_latitude": planARide.latitude!,
            "ride_meeting_longitude": planARide.longitude!,
            "ride_intensity": planARide.rideIntensity!,
            "time_length_of_ride": planARide.rideTime!,
            "reoccuring_ride": planARide.rideReccurring!,
            "special_instructions": planARide.specialInstruction!,
            "open_ride_to_biking_community": planARide.openRideToBikingCommunity!,
            "invitations": invitationsArray
        ]

推荐阅读