网路资讯的传输
主要是request 与 response 在互相传来传去
HTTP REQUEST
由Client端发起,在设计的时候希望是人类看的懂的格式(但缺点就是占记忆体,但是我们还是不要写死以免以后修改麻烦)
Request 分成4大部分,每个部分结束都有\r\n(共占两个Byte,可以查ASCII table,都有其意义)
一查知道是Enter与换行的意思。
carriage-return
用这张图当作Request的例子说明(这张图使用GET 方法):
1)Request line:注明用甚么方法,你要求的path,以及protocol
2)Header line:
HTTP 请求和相应的核心,它承载了关于用户端流览器,请求页面,伺服器等相关的资讯,可以自己根据需要定义。
它会揭露 client 端处理的能力(例如能够接受的格式)
每一行是以name:value对组成
EX:”User-Agent“就表明了你流览器版本和你所用的作业系统。
维基百科的栏位定义解释很清楚
3)carriage return =>\r\n(因此也会有人说header 有两个\r\n)
4)body:request 的 GET 方法没有body部分,而request 的 POST 方法有(其格式的定义会写在header里面)。
/**还是有人会把一些额外资讯放在url里面(所以看起来又臭又长)*/
参见:CCNP 笔记本 很详细!!
常见的 Request方法
1.GET 方法
通常用来获取文档,
Get 儘管没有 body部分,还是可以把一些附加资料放在 url (但还是不太好)
如下图:
另外一个 GET 方法例子:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 (Request line)Host: net.tutsplus.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)//流览器名和版本号.作业系统名和版本号.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //接受的档案格式Accept-Language: en-us,en;q=0.5 //用户默认语言,“q”值用来表示用户对该语言的喜好程度(0~1)Accept-Encoding: gzip,deflate //对压缩的支援Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300 //等待300秒释放Connection: keep-aliveCookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120Pragma: no-cacheCache-Control: no-cache
2.POST 方法
通常用来发送资料
一般来说发送表单是用 POST方法,因为 GET 不适合发送大量资料。
如下图:有颜色的地方都是 Header部分,蓝色区域是在描述 body 资料
例子:
POST /foo.php HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer: http://localhost/test.phpContent-Type: application/x-www-form-urlencoded //显示body 里面是甚么样的资料,喔!原来是表单!Content-Length: 43 //告知流览器将要传送档的大小,是流览器知道下载进度的原因(Bytes) first_name=John&last_name=Doe&action=Submit //这是body部分的资料
**其他较常见的HTTP/1.1 方法还有 HEAD (几乎跟GET一样,但比较像在测试能力:Server will not return the requested object in the return body.)
3. HEAD 方法:
当你发送了一个HEAD请求,那就意味着你只对HTTP Header感兴趣,而不是文档本身。
HTTP RESPONSE
如图:
1)第一行是status line
有protocol、 状态码(EX:200是发送成功,不存在的路径用404表示)、 状态
2)header 包含第四部份 data 的 type 与 length
3)\r\n
4)你要的档案放在第四部份
状态码 Status Code 参见 MDN HTTP Status Code
设计回应时不仅要处理正常的情况,连不正常的情况也要想到!
Informational responses (100–199)=>处理中,再等等
Successful responses (200–299)=>成功
Redirection messages (300–399)=>东西不在我这里,你可以去某某地方找?
Client error responses (400–499)=>客户端有问题?
Server error responses (500–599)=>server端有问题?
翻一翻文章觉得有些回应设计地好好玩!
来源:常见与不常见的 HTTP Status Code
Cookie
前面说过,HTTP 协定是 "stateless",但是我们还是希望省去每次都要对经常存取的会员网站输入登入资讯,于是Cookie(不是吃的那种,是由Netscape Communications[网景通讯]在1994创建的Cookie)就诞生了!
EX:Gmail 的持续登入、购物车等
Cookie 怎么运作?
步骤:
1)Client 请求
2)Server 需要纪录Client 的状态,因此在Head 给一个字串,如 Set-Cookie : id=1678(就是一段字串)
3)Client(浏览器) 收到之后,把Host的值与Set-Cookie的值联繫起来,并存放在local(本地端)的一个资料夹里。
4)再次请求时就把那个存放的值拿出来,这时Client 的 Head 就会有 Cookie 了!如 Cookie: id=1678
5)Server对该凭据进行验证,合法时Client不必输入使用者名和密码就可以直接登录
注意:Cookie 也会过期喔!
更多:资安趋势部落格 Cookie
缺点:
1)增加流量
2)安全性问题
下次从快取讲
参考文章:
[第四週] 网路基础 - HTTP、Request、Response
HTTP Headers for Dummies
维基百科 status code