【问题标题】:JSON parameter in multipart form PUT request in iOS Swift using AlmoFire使用 AlamoFire 在 iOS Swift 中以多部分形式 PUT 请求的 JSON 参数
【发布时间】:2020-12-27 04:48:04
【问题描述】:

我想使用 Almofire Networking 在 iOS Swift 中使用 Multipart/formdata put 请求上传图像,该网络参数很少,一个参数包含 JSON。例如

"parameter_name":{
"field_1" : {
  "type" : "MULTISELECT",
  "value" : [
    "Option 1",
    "Option 3"
  ],
  "name" : "Multi Selection"
},
"field_2" : {
  "type" : "DATE",
  "name" : "BirthDate",
  "value" : "2000-09-08"
},
"field_3" : {
  "type" : "SINGLESELECT",
  "value" : "Option1",
  "name" : "Single Select"
}
}

这是多部分表单数据中的一个参数,其他参数如姓名、电子邮件、照片等(均为字符串类型) 任何人都可以帮助我使用 Swift 和 AlamoFire 来实现这一点,因为我收到了 503 状态码。 注意:- 在邮递员中,相同的 API 工作正常。

到目前为止我所做的是:

Alamofire.upload(multipartFormData: { multipartData in
        parameters.forEach { (key, value) in
            if let arrdata = (value as? [AnyHashable : Any]) {
                if arrdata.count > 0 {
                    let arrdatas =  try! JSONSerialization.data(withJSONObject: arrdata, options: [])
                    multipartData.append(arrdatas, withName: key as String)
                }  
            }
            guard
                let data = (value as? String)?
                    .data(using: .utf8)
                else { return }
            multipartData.append(data, withName: key)
        }
        if let img = photo,
            let data = UIImageJPEGRepresentation(img, 0.0) {
            multipartData
                .append(data,
                        withName: Keys.photo,
                        fileName: Keys.fileName,
                        mimeType: Keys.mimeType)
        }
    },
                     to: "My URL",

                     headers: requestType.headers,
                     encodingCompletion: { encodingResult in
                        switch encodingResult {
                        case .success(let upload, _, _):
                            upload.responseData(completionHandler: { response in
                                if let statusCode = response.response?.statusCode,
                                    200 <= statusCode && statusCode < 300,
                                    let data = response.data {
                                    guard
                                        let decoded = try? JSONSerialization.jsonObject(with: data, options: []),
                                        let dic = decoded as? [String: Any] else {
                                            return
                                    }
                                    printOnlyOnDebug("Response got is --> \(self.convertToJSON(toConvert: dic))")
                                    
                                    success(data)
                                } else {
                                    guard
                                        let data = response.data,
                                        let decoded = try? JSONSerialization.jsonObject(with: data, options: []),
                                        let dic = decoded as? [String: Any],
                                        let message = dic[Keys.message] as? String else {
                                            let code = response.response?.statusCode == 503 ? 401 : response.response?.statusCode
                                            failure(code, "Network error")
                                            return
                                    }
                                    failure(response.response?.statusCode, message)
                                }
                            })
                        case .failure(let error):
                            failure(nil, error.localizedDescription)
                        }
    })
      

标题还包含'Content-Type' as 'multipart/form-data'

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    我忘记在 AlamoFire 请求中提及 PUT 方法类型,所以它正在创建 POST 请求并导致问题。

    Alamofire.upload(multipartFormData: { multipartData in
        parameters.forEach { (key, value) in
            if let arrdata = (value as? [AnyHashable : Any]) {
                if arrdata.count > 0 {
                    let arrdatas =  try! JSONSerialization.data(withJSONObject: arrdata, options: [])
                    multipartData.append(arrdatas, withName: key as String)
                }  
            }
            guard
                let data = (value as? String)?
                    .data(using: .utf8)
                else { return }
            multipartData.append(data, withName: key)
        }
        if let img = photo,
            let data = UIImageJPEGRepresentation(img, 0.0) {
            multipartData
                .append(data,
                        withName: Keys.photo,
                        fileName: Keys.fileName,
                        mimeType: Keys.mimeType)
        }
    },
                     to: "My URL",
                     method:.put,
                     headers: requestType.headers,
                     encodingCompletion: { encodingResult in
                        switch encodingResult {
                        case .success(let upload, _, _):
                            upload.responseData(completionHandler: { response in
                                if let statusCode = response.response?.statusCode,
                                    200 <= statusCode && statusCode < 300,
                                    let data = response.data {
                                    guard
                                        let decoded = try? JSONSerialization.jsonObject(with: data, options: []),
                                        let dic = decoded as? [String: Any] else {
                                            return
                                    }
                                    printOnlyOnDebug("Response got is --> \(self.convertToJSON(toConvert: dic))")
                                    
                                    success(data)
                                } else {
                                    guard
                                        let data = response.data,
                                        let decoded = try? JSONSerialization.jsonObject(with: data, options: []),
                                        let dic = decoded as? [String: Any],
                                        let message = dic[Keys.message] as? String else {
                                            let code = response.response?.statusCode == 503 ? 401 : response.response?.statusCode
                                            failure(code, "Network error")
                                            return
                                    }
                                    failure(response.response?.statusCode, message)
                                }
                            })
                        case .failure(let error):
                            failure(nil, error.localizedDescription)
                        }
    })
      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      相关资源
      最近更新 更多