Http协议是建立在TCP/IP上的无状态应用层协议。Http请求分为三个部分: 状态行, 请求头, 消息主题。
协议规定Post提交的数据必须放在消息主体(entity-body)中, 但协议并没有规定数据必须使用什么编码方式。实际上, 开发者可以自己决定消息主题的格式, 只要最后发送的Http请求满足上面的格式就可以
服务器端语言如java, 内置了自动解析常见数据格式的功能。服务器通常根据请求头(headers)中的Content-Type字段来获知请求中的消息主体是用何种方式编码, 再对主体进行解析。
application/x-www-form-urlencoded
最常见的Post提交数据的方式。浏览器原生form表单, 如果不设置enctype属性, 那么默认就会以application/x-www-form-urlencoded方式提交数据。当action为get的时候, 浏览器用x-www-form-urlencoded的编码方式把form数据数据按照key1=val1&key2=val2的方式进行编码, 然后把这个字串append到url后面, 用?分割。当action为post的时候, 浏览器把form数据封装到http body中, 然后发送到server。
用ajax提交数据, 也是使用这种方式, jqery的ajax, content-type默认值是application/x-www-form-urlencoded;charset=utf-8
multipart/form-data
使用表单上传文件时, 必须让form的enctyped等于这个值
以上这两种post数据的方式, 都是浏览器原生支持的, 而且现阶段原生form表单也支持这两种方式
application/json
用这个作为content-type的请求头, 告诉服务器端消息主体是序列化后的JSON字符串。除低版本的IE之外的各大浏览器都原生支持JSON.stringify, 服务器端也有处理JSON的函数
JSON格式支持比键值对复杂的多的结构化数据