如何使用Alamofire将JSON数据以form-data格式上传到服务端
Alamofire发送form-data格式JSON数据实现方案
- 先将待发送的JSON结构序列化为Data类型,推荐使用Swift内置的Codable协议实现,也可以用JSONSerialization做转换
- 调用Alamofire的upload接口构造multipart form-data请求,把序列化后的JSON数据作为表单字段添加到请求体中
- 监听请求回调,处理成功/失败响应
完整代码示例
首先定义数据模型遵循Codable协议,方便做JSON序列化:
// 子动作模型 struct RemoteAction: Codable { let vActionName: String let vActionCode: String let RemoteStatus: Int } // 设备数据根模型 struct DeviceItem: Codable { let DeviceID: String let RemoteID: String let vBrandName: String let vModelName: String let vRemoteType: String let RemoteAction: [RemoteAction] }
构造数据源并序列化为JSON数据:
// 构造符合要求的数据源 let actionList = [ RemoteAction(vActionName: "CH+", vActionCode: "123", RemoteStatus: 0), RemoteAction(vActionName: "CH-", vActionCode: "12345", RemoteStatus: 0), RemoteAction(vActionName: "CH-0", vActionCode: "123456", RemoteStatus: 0) ] let postData = [ DeviceItem(DeviceID: "Demo", RemoteID: "123", vBrandName: "VU", vModelName: "VU1", vRemoteType: "TV", RemoteAction: actionList) ] // 序列化为JSON Data guard let jsonData = try? JSONEncoder().encode(postData) else { print("JSON序列化失败,请检查数据结构") return }
发起form-data请求:
// 替换为实际的服务端接口地址 let serverURL = "替换为你的服务端接口地址" // 替换为后端约定的form-data字段名,常见字段名有data、jsonParam等 let formField = "后端约定的字段名" AF.upload(multipartFormData: { formData in // 添加JSON数据到表单,如需指定文件名和MIME类型可以用以下写法 formData.append(jsonData, withName: formField, fileName: "remoteData.json", mimeType: "application/json") // 如不需要文件名,仅作为普通字符串字段上传,使用以下写法即可 // formData.append(jsonData, withName: formField) // 如有其他表单字段需要添加,可在此处追加 // formData.append("testValue".data(using: .utf8)!, withName: "otherField") }, to: serverURL) .responseData { response in switch response.result { case .success(let resData): // 处理请求成功逻辑 if let resStr = String(data: resData, encoding: .utf8) { print("请求成功,返回内容:\(resStr)") } case .failure(let error): // 处理请求失败逻辑 print("请求失败:\(error.localizedDescription)") } }
特殊说明:如果你的项目中没有使用Codable,也可以通过JSONSerialization将字典数组转换为JSON数据,代码如下:
let postDictArray: [[String: Any]] = [ [ "DeviceID": "Demo", "RemoteID": "123", "vBrandName": "VU", "vModelName": "VU1", "vRemoteType": "TV", "RemoteAction": [ ["vActionName": "CH+", "vActionCode": "123", "RemoteStatus": 0], ["vActionName": "CH-", "vActionCode": "12345", "RemoteStatus": 0], ["vActionName": "CH-0", "vActionCode": "123456", "RemoteStatus": 0] ] ] ] guard let jsonData = try? JSONSerialization.data(withJSONObject: postDictArray) else { print("JSON序列化失败") return }
内容的提问来源于stack exchange,提问作者Pooja Puri
相关产品推荐
相关产品推荐

