如何在Alamofire中以form-data形式发送自定义对象
解决Alamofire发送form-data中自定义JSON对象到Java后端的问题
问题核心
后端通过@RequestPart接收JSON格式的Info对象和文件,但Alamofire发送时未正确指定JSON部分的媒体类型,导致415错误。
正确实现步骤
- 确保自定义
Info类实现Codable协议(用于JSON编码):
struct Info: Codable { // 你的属性,需和后端Java类字段一一对应 let name: String let size: Int // ...其他业务属性 }
- 修改上传方法,编码
Info为JSON并指定正确的Content-Type:
func uploadDocument(fileUrl: URL, fileInfo: Info, authKey: String) { let headers: HTTPHeaders = ["x-auth": authKey] // 将Info对象编码为JSON数据 guard let jsonData = try? JSONEncoder().encode(fileInfo) else { print("Info对象JSON编码失败") return } AF.upload(multipartFormData: { multipartFormData in // 添加文件,参数名对应后端@RequestPart的MultipartFile参数名"file" multipartFormData.append(fileUrl, withName: "file") // 添加JSON格式的fileInfo,关键是指定mimeType为application/json multipartFormData.append( jsonData, withName: "fileInfo", // 严格对应后端@RequestPart的参数名 fileName: "fileInfo.json", // 可选,模拟Postman的请求格式 mimeType: "application/json" ) }, to: "my_url", method: .post, headers: headers) .responseDecodable(of: UploadResponse.self) { response in switch response.result { case .success(let result): print("上传成功:\(result)") case .failure(let error): print("上传失败:\(error.localizedDescription)") } } }
错误原因分析
- 直接append自定义对象:Alamofire无法自动编码自定义对象,发送的格式完全不符合后端解析要求。
- 仅传JSON数据未指定mimeType:multipart中的该部分默认媒体类型不是
application/json,后端@RequestPart无法识别,返回415不支持的媒体类型错误。 - 调用
data(using:)方法:Info不是String类型,强转后调用该方法会直接抛出NSInvalidArgumentException异常。
额外注意事项
- 确保
Info的属性名和后端Java类的字段名完全匹配(若后端用@JsonProperty指定别名,Swift侧需通过CodingKeys对应设置)。 - 若后端对JSON格式有特殊要求(如日期格式、蛇形命名),需配置
JSONEncoder的对应参数。
内容的提问来源于stack exchange,提问作者Hritik Gupta
相关产品推荐
相关产品推荐

