3-3:HTTP协议之request和respond及常见请求方法和常见状态码
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-3:HTTP协议之request和respond及常见请求方法和常见状态码相关的知识,希望对你有一定的参考价值。
注意下面需要分析请求报头和响应报头的构成,需要使用到抓包工具,推荐使用fillder
一:request
(1)请求报文基本构成
在浏览器中输入百度的网址,选中相应数据,右侧显示中上半部分为请求报头,下半部分显示为相应报头,点击raw(原始数据)查看
信息具体如下
GET https://www.baidu.com/ HTTP/1.1 #请求行
Host: www.baidu.com #请求的主机
Connection: keep-alive #长连接 HTTP可以选择不断开TCP,从而连接持久化
sec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)#浏览器,操作系统信息
AppleWebKit/537.36 (Khtml, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: BIDUPSID=9F74B621908F780204441F86DCCE03A5; PSTM=1598331815; BAIDUID=9F74B621908F7802E2D41BCA0AE628E1:FG=1; BAIDUID_BFESS=9F74B621908F7802E2D41BCA0AE628E1:FG=1; BD_UPN=12314753; COOKIE_SESSION=0_1_1_1_0_0_0_0_1_0_0_0_0_0_0_1_0_1624878202_1624878201%7C1%230_1_1624878201%7C1; BDUSS=kFjVE4wOVphT2l-Ym82YnE5RHdJUlZTRW10MU5qM1lqS1p4eVUxaVNHR2pPUUZoRVFBQUFBJCQAAAAAAAAAAAEAAADjDoXG1-7Lp77NysfO0jYyMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOs2WCjrNlgR; BDUSS_BFESS=kFjVE4wOVphT2l-Ym82YnE5RHdJUlZTRW10MU5qM1lqS1p4eVUxaVNHR2pPUUZoRVFBQUFBJCQAAAAAAAAAAAEAAADjDoXG1-7Lp77NysfO0jYyMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOs2WCjrNlgR; BD_HOME=1; H_PS_PSSID=34099_34225_31253_34226_33848_34133_33607_34134_26350; sugstore=0; BA_HECTOR=ah85al8g252h0l05ui1gdoqqk0r #缓存信息
# 此行为空行
(2)请求方法
HTTP请求方法如下
1:GET方法
GET方法用来请求已经被URI识别的资源,指定的资源经过服务器解析后返回响应内容。比如请求的资源是文本,那么就会保持原样返回
使用GET方法请求的例子
2:POST方法
虽然用GET方法也可以传输实体的主体,但是一般不用GET方法进行传输,而是采用POST。虽然说POST的功能与GET很相似,但是POST的主要目的并不是获取响应的主体内容
使用POST方法请求的例子
GET和POST的区别
你现在打开我的这篇文文章阅读,浏览器就会发送GET请求给服务器,服务器则会返回相应的数据
而如果你在我的文章下面评论,点击提交后,浏览器就会执行一次POST请求,把你的评论放进请求报文里,然后拼接好POST请求头,再通过TCP协议发送服务器
3:PUT方法
PUT方法用来传输文件,比如QQ邮箱发送邮件添加附件,上传百度云盘文件都可以近似理解为PUT方法。为什么说近似呢,因为实际上PUT方法是不安全的,一旦对服务器进行写操作都是不安全的,而且在HTTP1.1中PUT方法自身又不带验证机制,因此任何人都可以上传文件,存在极大的安全隐患。所以一般的web网站是不会使用这样的方法的。
4:HEAD方法
HEAD方法只请求报文首部,而不获得报文正文
如下
5:DELETE方法
DELETE方法用于删除文件,和PUT相反。当然DELETE肯定也是不安全的,所以一般不会开放
二:respond
(1)响应报文基本构成
抓包信息如下
HTTP/1.1 200 OK #响应行
Bdpagetype: 2
Bdqid: 0x8231b40200113aab
Cache-Control: private
Connection: keep-alive # 长连接
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8 # 返回的文件类型
Date: Wed, 30 Jun 2021 13:08:55 GMT
Expires: Wed, 30 Jun 2021 13:08:55 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=271; path=/ # 服务器给客户端设置cookie
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=34099_34225_31253_34226_33848_34133_33607_34134_26350; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 162505853526142891629381477419473517227
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
# 此行为空行,下面是正文
dab
k k u V ?@ EͽC4ޏ #Gd ()! -* @ NIv I$[ S \\N * D +J , ǘ3 > /d= Y q t ; 4 } > ' ? w
*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***
可以看到响应报头正文部分均为乱码,其实这是HTTPS请求,已经被加密了
这里我们使用Linux中telnet工具尝试抓包
在命令行中输入telent www.baidu.com 80
,请求百度的80端口
接着我们手动进行请求,请求方法是GET,请求URL如果输入/
表示请求首页,版本为1.1
请求正文略过,直接输入换行,此时会发现百度服务器会将百度的首页,也就是一个HTML文件返回过来,这就是响应正文
其中content-length就是标识响应正文的长度的
(2)HTTP常见状态码
当客户端向服务器端发送请求时,会返回状态,借助它,用户可以知道服务器到底是正常了请求,还是出了问题,如果处理问题,到底是出了怎样的问题
HTTP状态码常见的共有五大类,不同数字具有不同的含义
2XX-成功
-
204-No Content:服务器已经成功处理了请求,但在返回的响应报文中不含实体的主体部分(另外,也不会允许返回任何实体的主体)。举例,如果你从浏览器发出的请求处理后,若返回204,那么浏览器显示的页面则不会发生更新。使用场景主要集中在只需要从客户端向服务器发信息,而对客户端不需要发送新信息内容的情况下使用
-
206-Partial Content:表示客户端发起了范围请求,同时服务器成功执行了此次请求。响应报文中的
“Content-Range”
指定范围的实体内容
3XX-重定向
该状态码表示浏览器需要执行某些特殊的操作才能正确处理请求
以302为例,你在没有淘宝网时,点击上面的购物车选项
本应该跳转到购物车页面,但是由于没有登录,所以服务器强制让你重定向到登录页面,可以发现次登录页面状态码是302
-
301-Moved Permanently:意思是永久重定向,表示请求的资源已经分配了新的URL,意思可以理解为人家网址已经变了,你的快捷方式(收藏)还指向以前的URL
-
302-Found:意思是临时重定向,表示请求的资源已经分配了新的URL,希望用户可以新的URL访问,但是这一次先放过你,虽然访问错了,但是服务器帮你跳转过来。
-
303-See Other:该状态码表示由于请求的圆存在着另一个URL,应使用GET(这一点和302有所区别)获取资源
-
304-Not Modified:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存定定向,用于缓存控制。
4xx-客户端错误
-
400-Bad Request:表示客户端的请求报文有错误,是一个很笼统的错误。
-
403-Forbidden:意思是服务器拒绝访问,并不是客户端的请求出错
-
404-Not Found:表示请求的资源在服务器上找不到,无法提供客户端
5xx-服务器错误 -
500-Internal Server Error:和400一样,是一个笼统性的错误,只是表明服务器出现了错误
-
501-Not Implemented:表示客户端请求的功能还不⽀持,类似“即将开业,敬请期待”的意思
-
502 Bad Gateway:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
-
503-Service Unavailable:表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后再试”的意思。
三:HTTP常见Header(字段)
可以看到不管是request还是response都有请求行这一部分
Host字段:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
Content-Length:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。
Connection字段:常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。
- HTTP/1.1 版本的默认连接都是持久连接,但为了兼容⽼版本的 HTTP,需要指定 Connection 首部字段的值为Keep-Alive 。
Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式
Content-Type: text/html; charset=utf-8
表示发送的是网页及其编码格式- 客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。
Accept: */*
表示可以接受任意格式
Content-Encoding 字段:段说明数据的压缩⽅法。表示服务器返回的数据使⽤了什么压缩格式
User-Agent: 声明用户的操作系统和浏览器版本信息,这东西在爬虫中涉及较多
referer: 当前页面是从哪个页面跳转过来的
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
以上是关于3-3:HTTP协议之request和respond及常见请求方法和常见状态码的主要内容,如果未能解决你的问题,请参考以下文章