You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Alamofire中以form-data形式发送自定义对象

解决Alamofire发送form-data中自定义JSON对象到Java后端的问题

问题核心

后端通过@RequestPart接收JSON格式的Info对象和文件,但Alamofire发送时未正确指定JSON部分的媒体类型,导致415错误。

正确实现步骤

  1. 确保自定义Info类实现Codable协议(用于JSON编码):
struct Info: Codable {
    // 你的属性,需和后端Java类字段一一对应
    let name: String
    let size: Int
    // ...其他业务属性
}
  1. 修改上传方法,编码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:43:29