http协议(一)
写了几篇tornado的源码分析, 觉得有必要把http的知识整理一下,
作为一名web开发人员, 怎么能不知道http协议呢.
这里我们暂且先不讨论tcp/ip与sokcet.
http协议是一个简单又复杂的协议, 说简单, 因为他的各式很容易理解, 但内容很多, 想要全面理解还是需要在实际中慢慢体会, 不多说了先来看看http协议的结构:
先来看看第一行:
第一行是请求的方法资源和协议用空格分割, 其格式为
GET/POST URI HTTP/1.0/HTTP/1.1 \r\n
其实这几行就可以请求一个网页了!!!
什么?你不相信, 那我们试一下
打开cmd 输入telnet www.baidu.com 80, 然后输入 GET / HTTP/1.1回车, 再回车百度的首页代码就出现了!
请求方法HTTP协议规定了7种:
GET POST PUT DELETE HEAD TRACE CONNECT 就常用的就是头两种, 你的浏览器貌似也只支持头两种
其他的在REST的设计中会用到
当然 你可以试着自己去定义一个头 不过标准的webserver大概会给你返回一个405的错误
GET方法是被设计用来查询的, 会把你请求资源的条件放到URL上, 就是?后的那一长串, 用=对应键值, &分割
POST本是被设计用来修改资源的, 不过因为浏览器的支持情况, 现在除了查询基本的功能其他都用post来实现.
PUT 是被设计用来增加资源的, 如果你用过couchdb那么你肯定会知道
DELETE 不用说了吧\
HEAD 只请求头, 大概是来验证用的
其他两个呢??我也不知道0,0. 大概是用来追踪错误信息的.
然后呢, 是文件头, 文件头也是用\r\n来分割, 一行一个key: value键值对到两个\r\n结束, 也就是说空行结束
这些信息也都会发给服务器, 然后服务器在给你返回一大堆, 有文件头和body
比如你的浏览器和系统信息就这样被出卖鸟:
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.20 (KHTML, like Gecko) Chrome/25.0.1337.0
我个人理解, http协议头大概分为3种
第一种表示来源, 上面的useragent就是, 其他的还有referer, host等.
第二种表示你请求的状态ETags, Last-Modified, If-Modified-Since当请求文件的时候, 这几个头很有用, 如果没有更改的话, 服务器会返回304, 然后body为空, 这样就节省了一大笔资源. 对了还有cookie这个不用说了吧.
第三种是接收类型, 多以Accept开头, 例如Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
表示浏览器能接收这几种mime格式, Accept-Encoding:gzip,deflate,sdch表示能接收的编码除了标准的字符流外还可以接收gzip, deflate, sdch这几种编码这个sdch是google自己发明创造的.
还有其他的自定义的头, 多以x开头例如jquery发送ajax请求的时候会加入X-Request-With:XMLHttpRequest头
还有其他的头:Connection:keep-alive这个是HTTP1.1的标准头表示链接会保持, 一段时间后如果浏览器关闭了, 那么就断开链接, 或者服务器也会自动关闭, Cache-Control表示缓存的控制一般浏览器请求是max-age=0表示不要给我加缓存
当发送Post请求的时候, 还会在头后面加上一段body, 长度会在Content-Length头中定义, 这样服务器就知道该继续读取多少字节的数据了!
先写到这吧, 明天来写返回格式, 表示我的水平太有限了, 好多都不懂 以后还要多多学习