企业资料通讯Week4 (3) | HTTP message

网路资讯的传输

主要是request 与 response 在互相传来传去

HTTP REQUEST

由Client端发起,在设计的时候希望是人类看的懂的格式(但缺点就是占记忆体,但是我们还是不要写死以免以後修改麻烦)

Request 分成4大部分,每个部分结束都有\r\n(共占两个Byte,可以查ASCII table,都有其意义)
一查知道是Enter与换行的意思。
carriage-return

https://ithelp.ithome.com.tw/upload/images/20211021/20135414edclLgCM7N.png


用这张图当作Request的例子说明(这张图使用GET 方法):

https://ithelp.ithome.com.tw/upload/images/20211021/20135414ZPZixfLdNG.png
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 (但还是不太好)
如下图:
https://ithelp.ithome.com.tw/upload/images/20211021/201354140XCWKANJIp.png
另外一个 GET 方法例子:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 (Request line)
Host: net.tutsplus.com
User-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.7
Keep-Alive: 300  //等待300秒释放
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache

2.POST 方法

通常用来发送资料
一般来说发送表单是用 POST方法,因为 GET 不适合发送大量资料。
如下图:有颜色的地方都是 Header部分,蓝色区域是在描述 body 资料

https://ithelp.ithome.com.tw/upload/images/20211021/20135414aWBvNA1oWe.png
例子:

POST /foo.php HTTP/1.1
Host: localhost
User-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
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-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

如图:
https://ithelp.ithome.com.tw/upload/images/20211021/20135414kiBgWoQlxB.png
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)=>成功 /images/emoticon/emoticon01.gif

Redirection messages (300–399)=>东西不在我这里,你可以去某某地方找?
Client error responses (400–499)=>客户端有问题?
Server error responses (500–599)=>server端有问题?

翻一翻文章觉得有些回应设计地好好玩!
https://ithelp.ithome.com.tw/upload/images/20211021/20135414tOIDI9L3gy.png
来源:常见与不常见的 HTTP Status Code

Cookie

前面说过,HTTP 协定是 "stateless",但是我们还是希望省去每次都要对经常存取的会员网站输入登入资讯,於是Cookie(不是吃的那种,是由Netscape Communications[网景通讯]在1994创建的Cookie)就诞生了!
EX:Gmail 的持续登入、购物车等

Cookie 怎麽运作?

https://ithelp.ithome.com.tw/upload/images/20211021/20135414ydMdCZjI3J.png
步骤:
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


<<:  政策(Policies)

>>:  Day33 - 【实战篇-预告】Device Code(4)

#0 - SCSS 不负责任快速入门

在铁人赛正式开始之前,想先写一下SCSS。 因为我的CSS全部都是SCSS写的...怕大家看不懂马上...

#26 初探 Electron

前两天我们做了一个网页服务器,接下来我们来帮它加上 GUI 吧! Electron Electron...

Day 3 : 建立Python开发环境吧(Linux)!

现在越来越多人使用Linux系统,所以今天会来介绍一下在Linux上使用终端机安装Python的方法...

Day 22 - Shortest Distance to a Character

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 821. Shortest D...

DAY1: node.js 不专业全新手上车

第一天主要想表达以下内容: 一.我是谁? 其实我只是一个普通的大学生,我的科系不全然是资工,但也有涉...