[http] http一些零碎
#
Content-Type
MediaType,即是Internet Media Type,互联网媒体类型;
也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
类型格式:type/subtype(;parameter)? type
主类型,任意的字符串,如text,如果是*号代表所有;
subtype 子类型,任意的字符串,如html,如果是*号代表所有;
parameter 可选,一些参数,如Accept请求头的q参数, Content-Type的 charset参数。
例如: Content-Type: text/html;charset:utf-8;
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
#
form
enctype
application/x-www-form-urlencoded
multipart/form-data
text/plain
application/json (deprecated)
application/x-www-form-urlencoded
这是默认的编码类型,使用该类型时,会将表单数据中非字母数字的字符转换成转义字符,
如"%HH",然后组合成这种形式key1=value1&key2=value2;
所以后端在取数据后,要进行解码。
若表单中有文件,则只留文件名。
multipart/form-data
该类型用于高效传输文件、非ASCII数据和二进制数据,将表单数据逐项地分成不同的部分,
用指定的分割符分割每一部分。每一部分都拥有Content-Disposition头部,指定了该表单项的键名和一些其他信息;
并且每一部分都有可选的Content-Type,不特殊指定就为text/plain。
一般来说,method和enctype是两个不同的互不影响的属性,但在传文件时,
method必须要指定为POST,否则文件只剩下filename;
当没有传文件时,enctype会改回默认的application/x-www-form-urlencoded。
text/plain
按照键值对排列表单数据key1=value1\r\nkey2=value2,不进行转义。
若表单中有文件,则只留文件名;
ajax
Content-Type
application/x-www-form-urlencoded
multipart/form-data
text/plain
application/json
text/xml
SSL延迟
客户端首先发送SYN数据包,然后服务器发送SYN+ACK数据包,最后客户端发送ACK数据包,接下来就可以发送内容了。
这三个数据包的发送过程,叫做TCP握手。
而HTTPs链接,它也采用TCP协议发送数据,所以它也需要上面的这三步握手过程。
而且,在这三步结束以后,它还有一个SSL握手。
HTTP耗时 = TCP握手
HTTPs耗时 = TCP握手 + SSL握手
#GET和POST的区别
浅显答案:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
深层答案:
GET和POST本质上都是TCP链接,并无差别。
但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
但并不是所有浏览器都会在POST中发送两次包,例如Firefox就只发送一次。