HTTP报文结构
HTTP的两种报文:
请求报文:client向server发送请求报文
响应报文:从server到client的应答
因为HTTP是面向文本的,因此 报文中的每个字段都是ASCII码串,故而每个字段的长度不确定。如上图所示:两种报文都是由三部分组成,两种报文格式的区别就是 开始行的不同。
开始行:用于区分是请求报文还是响应报文。在请求报文的开始行叫做请求行(Requesr-Line),在响应报文中的开始行叫做状态行(Status-Line)。在开始行的三个字段之间使用空格分割开,“CR” 和 “LF” 分别表示回车和换行(编写程序时用 \r\n)
首部行:用来说明 浏览器、服务器或报文主体的一些信息。首部可以有多行,但也可以不使用。在每一个首部行中都有首部字段名和其对应的值,每一行在结束的地方都要有“回车”和“换行。整个首部行结束时,还有一行空行将首部行与后面的实体主体分开。
实体主体:在请求报文中一般不用这个字段,而在响应报文中也可能没有这个字段。
HTTP请求报文
请求报文的第一行"请求行"只有三个内容,即方法、请求资源的URL以及HTTP协议的版本。 方法就是:对所请求的对象进行的操作,这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的。
如上图(谢老师书中的截图),GET HEAD POST是HTTP1.0最初定义的三种请求方法,其余5种由HTTP1.1所规定。
这部分可以看一下这位老哥的博客:HTTP报文的请求体和方法详解
接下来 我们分析一个完整的HTTP请求报文:
接下来详谈几个常用方法:
GET方法:请求指定的页面信息,并返回实体主体。通常请求server发送某个资源:
HEAD方法:类似于GET请求,只不过返回的响应中没有具体的内容,主要是用来获取报头(只返回首部,不会返回实体的主体部分)。
POST方法:向指定资源提交数据 进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。
TRACE方法:回显server收到的请求,主要用于测试或诊断(或者说用于验证是否如愿穿过了请求/响应链)。注:TRACE请求中不能带有实体的主体部分。如下图所示:TRACE请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹会一条TRACE响应,并在响应主体中携带它收到的原始请求报文。
在面试中最常问的方法就是上面的post和get的区别:
方法\区别 目标 安全特性 传输数据大小 字符集
POST方法 向server发送数据 安全高 可传输大量数据,上传文件时只可用POST 支持标准字符集,可传递中文字符
GET方法 从server上获取资源 不安全:URL可见,会泄露信息,如密码等 受URL长度限制,传输数量少但效率较高 只支持ASCII字符,向服务器传的中文字符可能会出现乱码
不安全的原因:GET传输数据是通过URL请求,以field(字段): value的形式,放在URL后,并用"?“进行连接,而多个请求数据间用”&"连接,这个过程我们用户是可见的(所以说GET是不安全的,就是因为URL是可见的,可能会泄露一些重要信息,如密码等)。POST传输数据将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的。
HTTP响应报文
每一个请求报文发出后都能够收到一个响应报文。响应报文的第一行就是状态行。
其状态行主要包含三部分内容:HTTP版本,状态码以及解释状态码的简单短语。
下面分析一个具体的HTTP响应报文:
这里面重要的就是状态码
常见的状态码有:
200 Accepted{接收}
301 Moved Permanently{永久地转移到其他URL}
302 Found{临时重定向}
400 Bad Request{错误的请求}
404 Not Found{找不到}
500 Internal Server Error{服务器内部错误}
这一部分可以详见这位老哥的博客:HTTP状态码
以及另一位老哥的博客:
巧记HTTP状态码
HTTP状态码由三位数字组成,第一个数字定义了状态码的类型,后两个数字没有分类的作用。状态码共分为5大类:
1**:表示通知信息,如请求收到了 或 正在进行处理
2** :表示成功,如接收 或 知道了
3** :表示重定向,如要完成请求 还必须采取进一步的行动
4** :表示客户的差错,如请求中有错误的语法 或 不能完成
5** :表示服务器的差错,如服务器失效无法完成请求