Alamofire的Session.upload(multipartFormData:)方法如何将负载整合到请求中
Alamofire MultipartFormData 请求格式解析
核心编码逻辑
Alamofire的Session.upload(multipartFormData:to:method:headers:)方法最终会把MultipartFormData中添加的所有键值对,编码为标准的multipart/form-data格式HTTP请求,和你之前用的JSON编码请求有本质区别:
- JSON编码的POST请求:整个请求体是单一JSON字符串,
Content-Type为application/json,所有参数都嵌套在这个JSON对象中 multipart/form-data编码的上传请求:请求体被随机生成的边界字符串分割为多个独立块,每个块对应你添加的一个键值对,Content-Type为multipart/form-data; boundary=随机生成的边界值
键值对和请求结构的对应关系
你通过MultipartFormData的append类方法添加的每一条内容,都会对应请求体里的一个独立块:
- 普通文本键值对
如果调用append(_ data: Data, withName name: String)添加文本参数,生成的块结构如下:
--[边界字符串] Content-Disposition: form-data; name="你传入的键名" 参数值的二进制内容
- 文件类键值对
如果调用带fileName和mimeType参数的append方法添加文件,生成的块结构会多两个属性:
--[边界字符串] Content-Disposition: form-data; name="你传入的键名"; filename="文件名" Content-Type: 你传入的MIME类型 文件的二进制内容
所有块拼接完成后,请求末尾会加上--[边界字符串]--标记整个请求体结束。
服务端解码方案
绝大多数服务端开发框架都内置了multipart/form-data格式的解析能力,不需要你手动拆分边界字符串:
- 直接通过框架提供的表单参数读取接口,按你在iOS端定义的键名,就能读取到对应的文本参数值
- 上传的文件也可以通过键名直接获取到文件流、文件名、MIME类型等元信息
内容的提问来源于stack exchange,提问作者shoe
相关产品推荐
相关产品推荐

