Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用[String:Any]参数构造多部分表单数据请求_Ios_Swift_Post_Multipartform Data - Fatal编程技术网

Ios 如何使用[String:Any]参数构造多部分表单数据请求

Ios 如何使用[String:Any]参数构造多部分表单数据请求,ios,swift,post,multipartform-data,Ios,Swift,Post,Multipartform Data,我发现了这段代码,它构造了多部分表单数据,但当参数为[String:String]时,它就起作用了。我的参数是[String:Any]。如何使用[String:Any] 我只展示了相关的代码,我希望它足以理解我的问题 typealias Parameters = [String: String] func construct() { //let parameters = ["name": "MyTestFile123321","description": "My tutorial te

我发现了这段代码,它构造了
多部分表单数据
,但当参数为
[String:String]
时,它就起作用了。我的参数是
[String:Any]
。如何使用
[String:Any]

我只展示了相关的代码,我希望它足以理解我的问题

typealias Parameters = [String: String]

func construct() {
    //let parameters = ["name": "MyTestFile123321","description": "My tutorial test file for MPFD uploads"]

    let parameters: [String : Any] = [
            "APIKey":apiKey,"accessToken":accessToken,
            "user":["email":emailTextField.text!],
            "profile":["name":nameTextField.text!,"dob":dateOfBirthTextField.text!
        ]

    let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)

}
func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {

    let lineBreak = "\r\n"
    var body = Data()

    if let parameters = params {
        for (key, value) in parameters {
            body.append("--\(boundary + lineBreak)")
            body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
            body.append("\(value + lineBreak)")
        }
    }

    if let media = media {
        for photo in media {
            body.append("--\(boundary + lineBreak)")
            //...
        }
    }

    body.append("--\(boundary)--\(lineBreak)")

    return body
}

extension Data {
    mutating func append(_ string: String) {
        if let data = string.data(using: .utf8) {
            append(data)
        }
    }
}

您可以执行以下操作,不过最好确认服务器端框架是否可以处理此类参数“name[key]”。许多现代框架都可以

相关的:


我已经尝试在您提到的github项目中使用以下参数

 // Try using this modified parameter in github project
  let parameters = ["user": ["name": "MyTestFile123321",
                               "description": "My tutorial test file for MPFD uploads"],"profile": ["title": "This is big title"]] as [String : Any]
我有
[String:Any]

typealias Parameters = [String: Any]

func construct() {

    // Change it with it your parameter

     let parameters = ["user": ["name": "MyTestFile123321",
                               "description": "My tutorial test file for MPFD uploads"],"profile": ["title": "This is big title"]] as [String : Any]

     let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)

}
func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {

    let lineBreak = "\r\n"
    var body = Data()

      if let parameters = params {

        for (key, value) in parameters {

            if let sValue = value as? String {
                body.append("--\(boundary + lineBreak)")
                body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
                body.append("\(sValue + lineBreak)")
            }else{
                if let dictionaryObj = value as? [String : String] {
                    for (key, value) in dictionaryObj {
                        body.append("--\(boundary + lineBreak)")
                        body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
                        body.append("\(value + lineBreak)")
                    }
                }
            }


        }
    }

    if let media = media {
        for photo in media {
            body.append("--\(boundary + lineBreak)")
            //...
        }
    }

    body.append("--\(boundary)--\(lineBreak)")

    return body
}

extension Data {
    mutating func append(_ string: String) {
        if let data = string.data(using: .utf8) {
            append(data)
        }
    }
}

希望对您有所帮助。:)

它确实有效,但我如何测试它是否真的有效?我正试图打印数据,但它只是转储十六进制值。很抱歉,它不起作用。“if let dictionaryObj=value as?[String:String]{”没有执行。我有以下格式的参数。似乎key=profile的else条件中的第一个参数没有执行,而key=user的第二个参数被执行让json:[String:Any]=[“APIKey”:key,“user”:[“email”:email],“profile”:[“name”:name,“dob”:dob]]这是根据类似问题的对象及其主题管理的,而不是对象>子对象>子对象。结构与您在上面的代码中使用的结构相同。正如您在上面的结构中所看到的,有两个子对象“user”和“profile”。它为“user”执行,但不为“profile”。“if let dictionaryObj=value as?[String:String]{”没有对循环中的“profile”obj执行。原因可能是什么?
typealias Parameters = [String: Any]

func construct() {

    // Change it with it your parameter

     let parameters = ["user": ["name": "MyTestFile123321",
                               "description": "My tutorial test file for MPFD uploads"],"profile": ["title": "This is big title"]] as [String : Any]

     let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)

}
func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {

    let lineBreak = "\r\n"
    var body = Data()

      if let parameters = params {

        for (key, value) in parameters {

            if let sValue = value as? String {
                body.append("--\(boundary + lineBreak)")
                body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
                body.append("\(sValue + lineBreak)")
            }else{
                if let dictionaryObj = value as? [String : String] {
                    for (key, value) in dictionaryObj {
                        body.append("--\(boundary + lineBreak)")
                        body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
                        body.append("\(value + lineBreak)")
                    }
                }
            }


        }
    }

    if let media = media {
        for photo in media {
            body.append("--\(boundary + lineBreak)")
            //...
        }
    }

    body.append("--\(boundary)--\(lineBreak)")

    return body
}

extension Data {
    mutating func append(_ string: String) {
        if let data = string.data(using: .utf8) {
            append(data)
        }
    }
}