如何为alamofire Post请求中的一个参数传递一个nil值

时间:2016-04-19 10:58:14

标签: swift post parameters alamofire

我想传递一个nil值,即可选参数值之一。并且必须在 Alamofire Post请求中继续使用nil值。如果您告诉我下一步该怎么办,会有帮助吗?

    let image: UIImage = UIImage()
    let imageData = UIImagePNGRepresentation(image)
    let base64String = imageData?.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

    let parameters = [
        "first_name": "XXXXX",
        "email" : "1234@gmail.com",
        "password" : "password",
        "profile_picture" : base64String]

Alamofire.request(.POST, "http://abc/public/user/register", parameters: parameters, encoding: .JSON, headers: nil)

        .progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
            print(totalBytesWritten)

            // This closure is NOT called on the main queue for performance
            // reasons. To update your ui, dispatch to the main queue.
            dispatch_async(dispatch_get_main_queue()) {
                print("Total bytes written on main queue: \(totalBytesWritten)")
           }
        }
        .responseJSON { response in
            debugPrint(response)
    }

即使 profile_pictures 为空,响应也会成功。我知道可以通过可选链接来完成,但不知道如何继续!!

4 个答案:

答案 0 :(得分:7)

通过传递nil或未初始化的可选参数Server将获得Optional

您可以将NSNull()传递给字典

试试这个,比如

var params = ["paramA","valueA"] if imageBase64 == nil {   parms["image"] = NSNull()} else {   params["image"] = imageBase64 }

swiftyjson也将null作为NSNull

处理

这里也有很好的参考 null / nil in swift language

答案 1 :(得分:1)

我认为您最简单的答案是添加"profile_picture"作为第二步。

var parameters = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password"]

if let base64String = base64String where !base64String.isEmpty {
    parameters["profile_picture"] = base64String
}

答案 2 :(得分:-1)

希望这会对你有所帮助:)。

var parameters :[String : AnyObject?] = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password"]

if let string = base64String where base64String.isEmpty != false {
  parameters["profile_picture"] = string 
} 

答案 3 :(得分:-1)

经过深入研究后,我发现可以通过可选的链接和类型转换轻松完成。

第一步是按类型将参数分为字符串图像,并检查字符串值和图像值的可用性。

let parameters: [String : AnyObject? ] = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password",
    "profile_pic" : UIImage(named: "logo")]

在请求方法

中这样做
for (key, value) in parameters {

                if let value1 = value as? String {
                    multipartFormData.appendBodyPart(data: value1.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
                }
                if let value1 = value as? UIImage {
                  let imageData = UIImageJPEGRepresentation(value1, 1)
                      multipartFormData.appendBodyPart(data: imageData!, name: key, fileName: "logo.png" , mimeType: "image/png")
                    }

您不必将参数拆分为两个,一个用于字符串值,另一个用于图像,也无需将图像转换为字符串。希望这个解决方案有所帮助!!