HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范,规定HTTP 请求分为三个部分:
- 状态行
- headers 请求头
- entity-body 消息主体
HTTP协议规定 POST 提交的数据必须放在消息主体(entity-body)中。
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
四种常见的 POST 提交数据方式
值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 |
application/json | 作为请求头告诉服务端消息主体是序列化的JSON字符串。除低版本的IE,基本都支持。 |
text/plain | 空格转换为 “+” 加号,但不对特殊字符编码。 |
- 浏览器的原生 <form>表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。如
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
我们使用表单上传文件时,必须将 enctype 设为 multipart/form-data。
application/json作为请求头,用来告诉服务端消息主体是序列化的JSON字符串。如
BASHPOST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
- text/xml,一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。XML-RPC(XML Remote Procedure Call),如
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>