【问题标题】:Adding headers to Alamofire multiPartFormData upload将标题添加到 Alamofire multiPartFormData 上传
【发布时间】:2017-10-21 16:08:11
【问题描述】:

在试图弄清楚这一点时遇到了困难。使用 Alamofire (4.4.0) 发布请求,我的标头在大多数情况下都可以正常工作,但是这次我需要发送一个字符串字典和一个视频。

视频是通过 UIImagePickerController 录制的,最终进入字典的信息是通过一系列滑块、开关和文本字段创建的。

给我带来麻烦的块如下:

let headers: HTTPHeaders = [
        "X-Access-Token": self.user
    ]
let requestUrl = try! URLRequest(url: "http://exampleUrl.com", method: .post, headers: headers)

    upload(
        multipartFormData: { (multipartFormData) in
            multipartFormData.append(videoURL!, withName: "video_source")
            multipartFormData.append(self.alphaLabel.text!.data(using: .utf8)!, withName: "alpha")
            multipartFormData.append(self.betaLabel.text!.data(using: .utf8)!, withName: "beta")
            multipartFormData.append(self.gammaLabel.text!.data(using: .utf8)!, withName: "gamma")
            multipartFormData.append(self.deltaTextField.text!.data(using: .utf8)!, withName: "delta")
            multipartFormData.append(self.epsilonScrollPicker.data(using: .utf8)!, withName: "epsilon")
            multipartFormData.append(zetaArray!.data(using: .utf8)!, withName: "zeta")

        },
            to: requestUrl as! URLConvertible) { encodingResult in
                switch encodingResult {
                case .success (let upload, _, _):
                    upload.responseJSON { response in
                        print(response)
                    }
                case .failure (let encodingError):
                    print(encodingError)
            }
       }

上面的代码给出: "线程 1:信号 SIGABRT"

控制台输出: “无法将 'Foundation.URLRequest' 类型的值转换为 'Alamofire.URLConvertible'。”

为了检查其他一切是否正常,我运行了这个:

let requestUrl "http://exampleUrl.com"

upload(
    multipartFormData: { (multipartFormData) in
        multipartFormData.append(videoURL!, withName: "video_source")
        multipartFormData.append(self.alphaLabel.text!.data(using: .utf8)!, withName: "alpha")
        multipartFormData.append(self.betaLabel.text!.data(using: .utf8)!, withName: "beta")
        multipartFormData.append(self.gammaLabel.text!.data(using: .utf8)!, withName: "gamma")
        multipartFormData.append(self.deltaTextField.text!.data(using: .utf8)!, withName: "delta")
        multipartFormData.append(self.epsilonScrollPicker.data(using: .utf8)!, withName: "epsilon")
        multipartFormData.append(zetaArray!.data(using: .utf8)!, withName: "zeta")

    },
        to: requestUrl as! URLConvertible) { encodingResult in
            switch encodingResult {
            case .success (let upload, _, _):
                upload.responseJSON { response in
                    print(response)
                }
            case .failure (let encodingError):
                print(encodingError)


        }
    }

如果我使用不同的请求 URL,一个没有其他参数的 URL,我会从我的服务器获得 401 - 无效访问令牌。这是意料之中的,因为我无法通过这个新请求在标头中传递一个。

如果有人能阐明如何上传 multiPartFormData 请求并且包含用于身份验证的标头,我将不胜感激。

【问题讨论】:

    标签: swift3 alamofire ios10


    【解决方案1】:

    我刚刚在我的工作代码中添加了您的 Headers。您可以用它替换您的代码。

        let yourHeaders: HTTPHeaders = [
            "X-Access-Token": "dsfdsfdsf"
        ]
    
        Alamofire.upload(multipartFormData: { multipartFormData in
    
            for (key, value) in parameter
            {
                multipartFormData.append(value.data(using: .utf8 )! , withName: key)
            }
            for videoData in VideoDataArray 
            {
                if  videoData 
                {
                    multipartFormData.append(videoData , withName: videoParameterName, fileName: "videoName.mp4", mimeType: "video/mp4")
                }
            }
        }, to: "YourApiUrlHere", method: .post, headers : yourHeaders,
                encodingCompletion: { encodingResult in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        print(upload.progress)
    
                        upload.responseJSON {  response in
    
                            if let JSON = response.result.value
                            {
                                print("JSON: \(JSON)")                              
                        }
                        break
                    case .failure( _):
                        }
                    }
            })
    

    【讨论】:

    • 我并没有尝试上传图片。所以我不相信我能够使用您的 UIImageJPEGRepresentation。除非你知道 kUTTypeMovie 的等价物,否则我不知道你所拥有的是否能满足我的需要。
    • @NickDiVona 我告诉过你添加参数并处理响应。这只是 Almofire 方法调用的一个表示。如果你知道 UIImageJPEGRepresentation 返回 NSData 并且你可以在那里添加你的视频数据。
    • 啊,我明白了。谢谢。
    • 投票也可以,对别人有帮助。
    猜你喜欢
    • 2017-01-30
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多