form-data/x-www-form-urlencoded/raw/binary
来源:互联网 发布:淘宝没有安能物流 编辑:程序博客网 时间:2024/05/23 00:02
form-data
http请求中的multipart/form-data,他会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件的时候,会有Content-type表示文件类型;
不对字符编码!有boundary隔离,所以multipart/form-data 既可以上传文件,可以上传键值对。
那么到底什么是多部分媒体类型?
MIME中的 multipart 表示报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分是独立的,有各自的描述其内容的集;
不同部分之间用分界字符串连接在一起boundary~
多部分表格提交
当提交填写的HTTP表格时,变长的文本字段和上传的对象都作为 多部分主体(multipart Body )里面独立的部分发送,这样在表格就可以填写各种不同类型和长度的值。
HTTP使用Content-Type:multipart/form-data 或者 Content-Type:multipart/mixed这样的首部以及多部分主体来发送这种请求:
Content-Type:multipart/form-data;boundary=[asdasdsd]
boundary就是分割body(主体)中不同部分所用的字符串。
<form action="http://server.com/cgi" enctype="multipart/form-data" method="post"><p>xxx</p><input type="submit" value="Send"></form>
我们的用户代理可能会得到下面这样的数据:
------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="id"WU_FILE_0------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="name"Tulips.jpg------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="type"image/jpeg------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="lastModifiedDate"Tue Jul 14 2009 13:32:31 GMT+0800 (中国标准时间)------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="size"161781------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="chunks"2------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="chunk"0------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="file"; filename="Tulips.jpg"Content-Type: application/octet-stream------WebKitFormBoundaryfyAzqkdimkhorKIo--
x-www-form-urlencoded
而application/x-www=form-urlencoded会将表单的数据转换为键值对,如:
name=java&age=23
在Request body中是这样的:
//headerContent-Type:application/x-www-form-urlencoed//bodyname1=valu1&name2=value2
Raw
可以上传任意格式的文本,text json xml html等
不会有任何编码或者Boundary分隔符。
Binary
相当于Content-Type:application/octet-stream
从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。
multipart/form-data 与 x-www-form-urlencoded的区别
前面也说过了
区别:
- multipart/form-data是有一个内容分割符用于分割请求体中的多个POST内容,也就是分割前面的几个key值对应的内容:这可能是文件也可能是值
- multipart/form-data最后会转为一条信息,请求body是字符串。
- 而x-www-form-urlencoded是经过编码的,键值对是分隔开的(将空格转换为”+”符号,特殊字符转换为ASCII HEX值)
- 还有一个重大的区别,是后台处理这两种类型的request body 是不同的。
对于 application/x-www-form-urlencoded
用这种方式请求,在后台接收的时候。可以直接从req.body获取这些key的值。 因为它是经过编码好的。所以是可以直接像这样来获取
var handle=function(req,res){ if(req.headers['content-type']==='application/x-www-form-urlencoded'){ req.body=querystring.parse(req.rawBody); }};
解析一下,req.body现在就是一个对象了,
你可以像 req.body.username req.body.password这样访问获取键值。
对于 multipart/form-data
直接不能像这种方式解析,而要引入formidable模块
exports.uploadFile=function(req,res){ //console.log(hasBody(req)); //judging if len over the limit var len=req.headers['content-length']?parseInt(req.headers['content-length'],10):null; if(len&&len>bytes){ return res.status(413).end(); //res.writeHead }//shoule save in somewhere if(hasBody(req)){ if(mime(req)==='multipart/form-data'){ var form=new formidable.IncomingForm(); form.parse(req,function(err,fields,files){ req.body=fields; req.files=files; console.log("parsing..",req.body); console.log(req.files); return res.json({msg:'sucess',result:0}); }) } }else{ console.log('No file uploading..'); return res.json({msg:'failed',result:1}); }}
主要是帮我们找到分隔符,然后分割开每个部分来解析,此时。
files是multipart/form-data中的文件
field是当中的字段。键的值
因为一个multipart/form-data其实可以理解为是fields和files的组合~ 这样分别即系比较好
这里我只上传了一个文件,可以发现对于field是一个空对象,因为我们没有键值。
而文件有,这是对文件的解析内容。
multipart/form-data分析:
http协议规定了以ASCII码传输,建立在TCP/IP协议之上,规范把http请求分为3个部分:状态行、请求头、请求体。
实现都是围绕如何运用和组织这三部分来完成的。
http协议本身原始方法不支持这种multipart/form-data请求,它利用post方法组合实现的.
请求头必须包含:Content-Type,值必须为multipart/form-data,同时规定一个内容分割符用于分割请求体中的多个post内容。
构造方式不同
multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。
- form-data、x-www-form-urlencoded、raw、binary的区别
- form-data/x-www-form-urlencoded/raw/binary
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- 【postman】中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman 中的 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别》》》原文链接
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- Homebrew简介及安装
- Android开发——BaseAdapter的优化
- 约翰霍姆金斯大学_the I-STAR Lab
- 查看用户权限与GRANT用法
- xchfjgikyuiksdy
- form-data/x-www-form-urlencoded/raw/binary
- torch环境搭建
- 对JAVA集合进行遍历删除时务必要用迭代器
- NuttX的学习笔记 9
- java代码混淆
- java-迭代删除
- USB驱动简单分析一
- 【Codeforcdes 237C. Primes on Interval】+ 二分
- android Manifest介绍