【问题标题】:Passing an array of parameters as a request body in swift在 swift 中将参数数组作为请求正文传递
【发布时间】:2021-09-22 03:47:51
【问题描述】:

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

{
   "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.})

【问题讨论】:

  • 以下行没有意义。 request.httpBody = 试试? JSONSerialization.data(withJSONObject: [参数])
  • 你为什么这么说?
  • 您使用查询项目数据只是将其传递到正文中,例如request.httpBody = queryItemsData
  • 请向我们展示 API 规范。无论您在 POST 请求的正文中发送什么,都需要采用后端期望的确切形式和内容类型。例如,您向我们展示了一个 JSON 对象,其中包含一个元素“水印”。您可以发送对象或数组或包装在数组中的对象,但除非您向我们展示后端的期望,否则您不能期望得到有帮助的答案。
  • @CouchDeveloper 这就是后端所期望的!第一段代码是服务期望的参数。这是必须通过的示例

标签: ios json swift


【解决方案1】:

初始化变量

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

逻辑

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

设置变量

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
        ]

【讨论】:

  • 我试过了,但没有用。我用我得到的东西更新了问题
【解决方案2】:

尝试这样做

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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2022-11-18
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多