具有特定 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 上返回错误@,它们在validate
和response*
通话期间可用。
Alamofire 5 看这里***.com/questions/54985001/…
啊,好吧,当您尝试访问 image[0] 时,您的意思是要访问 images[0] 吗?因为那里没有可以访问的图像变量
我已经编辑了我的答案。希望它能消除你所有的疑虑。以上是关于具有特定 JSON 要求的多部分表单数据 POST的主要内容,如果未能解决你的问题,请参考以下文章
错误的多部分 - 服务器上的 POST(json + 图像)