具有特定 JSON 要求的多部分表单数据 POST

Posted

技术标签:

【中文标题】具有特定 JSON 要求的多部分表单数据 POST【英文标题】:Multipart Form Data POST with spesific JSON Requirement 【发布时间】:2022-01-24 05:05:18 【问题描述】:

我是 Alamofire 新手,现在使用 Alamofire 5。我想创建一个包含多部分表单数据的 POST 请求,但对 JSON 正文有特定要求。这里是:

"item": [
    
        "name": "Upload image",
        "request": 
            "method": "POST",
            "header": [],
            "body": 
                "mode": "formdata",
                "formdata": [
                    
                        "key": "files[]",
                        "type": "file",
                        "src": []
                    ,
                    
                        "key": "mode",
                        "value": "public",
                        "type": "text"
                    
                ]
            ,
            "url": 
                "raw": "https://jsonplaceholder.typicode.com/api/image/upload",
                "protocol": "https",
                "host": [
                    "jsonplaceholder",
                    "typicode",
                    "com"
                ],
                "path": [
                    "api",
                    "image",
                    "upload"
                ]
            
        ,
        "response": []
    ,
]

任何人都可以帮助我如何发布数据但使用多部分表单数据?请帮忙。 (POST请求使用URLSession也没关系)

【问题讨论】:

你为什么要问和你已经问过的同样的问题? ***.com/questions/70444111/…你能解释一下为什么你想要这种长请求吗? @ShabnamSiddiqui 因为我的问题有一些变化,我也不知道为什么它必须是那么长的请求,这只是我收到的要求。你能帮忙吗? 这是您应该发送的整个 JSON,还是 API 的文档?因为那是不同的,因为您只需要发送非常基本的部件"formdata": [HERE],而且我想您已经了解了如何发送多格式部件数据,对吧? @Larme 这就是我感到困惑的地方。是的,我确实认为这只是 API 的文档,我打算只发送“formdata”部分。但是我对 alamofire 和 post 请求完全陌生,我也很困惑,因为在那个文档中,“formdata”有两个部分,即 [“key”、“type”、“src”] 和 [“key”、“值类型”]。如何用它制作多个表单数据? ***.com/questions/55264097/… 你“循环和追加”了两次。 【参考方案1】:

无论我从你的问题和 cmets 中了解到什么,我都根据你之前的问题创建了一个方法。

func postImage(images: [UIImage],imgName : [String]) 
    var arrFormData = [[String:Any]]()
    var imgDataArray: [Data] = []

    for image in images 
        guard let imgData = image.jpegData(compressionQuality: 0.50) else  return 
        
        imgDataArray.append(imgData)
    
    let param1: [String: Any] = [
            "key":"files[]",
            "type": "file",
            "src": imgName
        ]
    let param2: [String: Any] = [
        "key": "mode",
        "value": "public",
        "type": "text"
        ]
    var arrParam = [[String:Any]]()
    arrParam.append(param1)
    arrParam.append(param2)
    arrFormData.append(contentsOf: arrParam)
    var param : [String:Any] = [:]
    if let theJSONData = try? JSONSerialization.data(
        withJSONObject: arrFormData,
        options: []) 
        let theJSONText = String(data: theJSONData,
                                   encoding: .ascii)
        print("JSON string = \(theJSONText!)")
        param = ["formData" : theJSONText ?? ""]
    
    print(param)
    Alamofire.upload(multipartFormData: 
        multipartFormData in
         for i in 0..<images.count
            if let imageData = images[i].jpegData(compressionQuality: 0.6) 
                multipartFormData.append(imageData, withName: "file", fileName: "name.png", mimeType: "image/png")
            
        

        for (key, value) in param 
            multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        
    , usingThreshold: 10 * 1024 * 1024,to: apiurl, method: .post, headers: headers, encodingCompletion:  encodingResult in
        switch encodingResult 
        case .success(let upload, _, _):
            upload.responseJSON 
                response in
                print(response.result)
            
        case .failure(let encodingError):
            print(encodingError)
        
    )

【讨论】:

真的谢谢你!但是为什么我在调用错误中得到额外的参数'encodingCompletion'?它应该没有 encodingCompletion 吗? usingTreshold 有什么作用? 可能你正在使用 Alamofire 5,Alamofire 5 不再需要 encodingCompletion! 相反,多部分表单编码是作为标准现在异步请求过程的一部分完成的,并将在 @987654324 上返回错误@,它们在validateresponse* 通话期间可用。 Alamofire 5 看这里***.com/questions/54985001/… 啊,好吧,当您尝试访问 image[0] 时,您的意思是要访问 images[0] 吗?因为那里没有可以访问的图像变量 我已经编辑了我的答案。希望它能消除你所有的疑虑。

以上是关于具有特定 JSON 要求的多部分表单数据 POST的主要内容,如果未能解决你的问题,请参考以下文章

使用 alamofire 的多部分/表单数据

错误的多部分 - 服务器上的 POST(json + 图像)

解析Servlet中传入的多部分/表单数据参数的便捷方法[重复]

如何发布具有多部分/表单数据编码的数组?

验证隐藏的多复选框/输入字段

将具有多个字段的表单数据转换为 JSON Jquery Javascript