HTTP的学习
首先一定要告诉自己!是的!这部分你就像一个智障一样! 或者说,你就是一张白纸,还必须允许人家在你身上涂涂画画! 噢漏,瞬间觉得自己好卑微啊~ 伦家不依啦! 那还不赶紧滚去学习?! 好的! 五年之内,搞定HTTP! 瞅你丫出息···
HTTP念得时候,我是H T T P 念下来的!(sei不是?) 他全称是HyperText Transfer Protocal,翻译我天朝语言就是超文本传输协议! 对比一下,好的,我知道protocal是协议的意思了!虽然这并不是重点===
那么,然后呢?我知道是超文本协议,然后呢? 然后就是他的作用啊! 协议就是指计算机通讯网络中两台计算机之间进行通信所必须共同遵守的规定或规则啊!那HTTP就是一种通信协议,就是什么呢?他允许将超文本标记语言(html)文档从web服务器传送到客户端的浏览器。就是一幅图啊,我不会画···盗一个喽!
那么呢,有时候会有一个中转站,也就是代理服务器,他有三个重要的功能:
①:提高访问速度,大多数的代理服务器都有缓存功能
②:突破限制,也就是可以FQ了(FQ毛线啊!我以为的FQ就是越狱为了上油管儿啊!)
③:隐藏身份(又不是spy隐藏个JB啊!)
那么存在这种中转站的示意图就是这个鬼样子啦!
看懂了吧?就是每次我们输入URL的时候,我们的浏览器就会发送一个request给中转站,然后中转站再发送一个request给web服务器,这个时候呢,服务器就会返回一个response给中转站,中转站表示这锅我不背,又给浏览器返回一个response!浏览器就会解析response里面的html;这个时候,我们在浏览器就看到了一个页面···
接下来就要说说URL了,URL(uniform resource locator 统一资源定位系统)是用于描述一个网络上的资源。他的固定格式就是:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
一个一个解释喽!不然我自己都懵逼!说了自己是个智障啊!
schema:就是我们知道的协议 HTTP HTTPS FTP这种的啊
host:不就是HTTP协议的IP地址或者是域名
port:端口号咯,服务器默认是80,如果一样就不要瞎折腾了,就是不用再写了,如果不是,就不要总想着搞个什么大事情了!乖乖写上吧!不然出错sei也帮不了你啊!
path:访问资源的路径
url-params|query-string:这些是传入的数据啊
anchor:锚,知道什么是锚吧?不知道就算了!我有什么办法?我也很绝望啊!
栗子:没有端口号的哦!不要问为啥不写!
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff
我们要知道,这个HTTP他可是没有状态性的!什么意思呢?就是说,你第一次去请求,第二次又去请求,对于http服务器来讲,他并不知道这两次请求来自一个客户端。所以,我们就引入了cookie来解决这个问题。
通过对比消息结构,request和response的:
Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
正如很多面试一样,我这里也要巩固一下get和post的区别啊!:
1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
紧接着就是我们的状态码了
来瞅瞅response部分吧 看那个消息 就知道他的构成了
Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
对于常见的,我也做了总结:
200 ok:最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端
如图,当我打开博客园时,就是这个熊样子:
瞅见没? 200 ok!
302 FOUND :重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。例如在IE中输入http://www.google.com. HTTP服务器会返回304, IE取到Response中Location header的新URL, 又重新发送了一个Request.
可不就是这个熊样子:
304 Not Modified :代表上次的文档已经被缓存了, 还可以继续使用,例如打开博客园首页, 发现很多 Response 的status code 都是304
不让你看看效果你肯定好奇啊!:
提示: 如果你不想使用本地缓存可以用Ctrl+F5强制刷新页面
400 Bad Request 客户端请求与语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found
请求资源不存在(输错了URL)
比如在IE中输入一个错误的URL, http://www.cnblogs.com/tesdf.aspx
500 Internal Server Error 服务器发生了不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
那针对request的呢 我就不说了 因为我觉得和我们前端关系不大!好吧,非要知道,等后期想要再深入巩固自己的时候再添加吧!最后,我们来总结一下一个重点:
HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
好啦! HTTP的学习暂时告一段落啦!以后再见!皮皮虾,我们走!
时隔不知道几日,我又来补充我的HTTP学习了!这次我参考的可是犀牛书!入手价好几十,当时可心疼死我了!而且买了之后两个多月没看过···为了不辜负我的几十大洋!最近还是决定拿出来看看···马丹!日常跑题!
当我看书时,看到了一个新单词!Comet!原谅我年少无知并不知道这丫是个啥玩意儿,不过大概看出来了,这厮和ajax是正好相反的额!人家ajax是从服务端得到东西,这厮是推送东西。这大三角关系真是尴尬!不过也是一出好戏啊!
ajax提供了一个脚本化HTTP的web应用架构,所以接下来···嘿嘿···要!学!a!j!a!x!
我是说JavaScript的ajax不是jQuery那一套的!首先呢!new一个!new一个啥?肯定不是new一个大野驴啊!new一个XMLHttpRequest();这一步之后后面才会起作用啊!然后就是open()一下了。我们长江后浪推前浪,新人更比老人浪~更开放!所以咱们open里面有很多参数,不过虽说有容乃大吧,但人家也是讲究的风尘女子~不是sei都接受的!所以那些个用户名,密码啥的阿猫阿狗就可有可无了~~
有了跑龙套的!就肯定有男主角啊!由于本人对这种抽烟喝酒的好女孩儿没什么好感,暂定我们的男猪脚又老又丑又猥琐吧!还是俩!一个叫方法,一个叫路径!方法离过婚,还带了几个孩子,两个亲生的!一个post,一个get,还有几个没查过DNA,不晓得是不是隔壁老王的!是HEAD,OPTIONS,PUT,DELECT;杯具的是,还有几个,已经证实就是隔壁老李头的了!叫HTTPCONNECT,TRACE,TRACK!这仨孩儿被强行领盒饭,以后估计我们是看不到了!那接下来咱们看看路径君,路径君是个风流的丑男人,只要他想,每一次都可以带来不同的妞儿,只不过几个字母的修改!没在怕的!
讲了这么多,无非是为了故事的继续发展啊!这不,方法xi和路径君都已经认识了女猪脚,这个时候我们就要有一个什么的力量send()我们打开新世界的大门,这个大门打开后,我们还是看不见新世界的!因为有结界啊!我们就等状态呗! 说到send这里就尴尬了,我一直以为send是不用参数的,可是书里说了是get时参数为null;post时就更麻烦了,涉及到setRequestHeader()方法,天了噜~头怎么突然大了起来?这个时候,setrequestheader()里面的指定“Content-Type”头,还有外部函数的参数msg就是send里面的参数!别看不懂我在港咩介!
一旦readyState === 4&&status === 200的时候,都会触发onreadystatechange事件!是不是很诡异?哪有?!这个时候去得到responText啊!里面有意外惊喜的!
这是小的以前写的关于ajax的!和上面说的有些许出入,但大体都是一样的,而且响应这种事情,不能强求,不必想求,不需强求···
可以看出啊,我用的是不是同步响应,同步这种虽然很吸引人,但是应尽量避免使用啦!因为客户端JavaScript是单线程的,一旦send()方法阻塞,就会导致UI冻结,下面的就嗝屁了!那还玩个溜溜球啊!
所以大部分情况下,我们还是使用异步的!就是把send()写在onReadyStateChange()后面~这是大部分写法,当然我上面写的那种也OK啦~
var type = request.getResponseHeader("Content-Type");可以获得相应的类型!