http请求头中application/x-www-form-urlencoded和multipart/form-data区别
application/x-www-form-urlencoded和multipart/form-data是两种不同的 Content-Type,它们在网络请求中(尤其是 POST 请求)用来指定表单数据的编码格式
application/x-www-form-urlencoded:
• 这是最常见的表单数据编码方式,也是 HTML 表单的默认编码类型。
• 所有表单字段名和值都会进行 URL 编码(即百分号编码),然后通过 "&" 符号连接起来形成一个长字符串。
• 它不适用于传输二进制数据,例如文件上传,因为所有数据都被转换成了 ASCII 文本格式。
• 数据量有限制,因为在 URL 中可能会遇到长度限制,并且不能很好地处理大数据或特殊字符。
报文格式:
POST /submit-form HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 60 username=admin&password=secretpassword&message=Hello%20World&isAgreed=true
multipart/form-data:
• 这种编码方式主要用于需要上传文件的表单场景。
• 每个表单字段都在消息正文中作为一个单独的部分(part),每个部分有自己的“Content-Disposition”头,用于描述字段名和文件名(如果适用的话)。
• 不会对字段名和值进行 URL 编码,而是保持原始数据格式,特别适合传输二进制文件数据。
• 可以同时上传文本字段和文件,每一个部分之间用边界字符串分隔开来,便于服务器解析各个字段内容。
• 不受 URL 长度限制,能上传较大的数据块。
报文格式
POST /upload-form HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Length: .jpg ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="example.jpg" Content-Type: image/jpeg <binary data of the image file> ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="description" This is an example image. ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
总结起来,在选择表单数据编码格式时,如果只是提交简单的键值对且不包含文件,一般使用application/x-www-form-urlencoded;而如果有文件上传或者其他复杂数据结构需要保持原样传输,则使用multipart/form-data