作为一个开发人员,掌握必要的 HTTP 协议十分重要,下面就通过本文记录自己对 HTTP 协议的理解。
HTTP 基本概念
HTTP,全称为 HyperText Transfer Protocol,即为超文本传输协议。是互联网应用最为广泛的一种网络协议,所有的 www 文件都必须遵守这个标准。
它是一种建立在TCP/IP上的无状态连接,默认端口为80。整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目。
HTTP可分为两个部分:请求和响应
1.HTTP请求
HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。
HTTP请求由状态行、请求头、请求正文三部分组成:
- 状态行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
HTTP请求报文:
image.png报文实例:
image.png1.请求报文的起始由请求行构成(有些资料称为状态行,名字不一样而已,都是指的一个东西),用来说明该请求想要做什么,由<Method>、<URL>、<Version> 三个字段组成,注意每个字段之间都有一个空格。
其中<Method>字段有不同的值:
- GET --- 访问服务器的资源
- POST --- 向服务器发送要修改的数据
- HEAD --- 获取服务器文档的首部
- PUT --- 向服务器上传资源
- DELETE--- 删除服务器的资源
<URL>字段表示服务器的资源目录定位
<Version>字段表示使用的http协议版本
2.首部部分由多个请求头(也叫首部行)构成,那些首部字段名有如下,不全:
- Accept 指定客户端能够接收的内容格式类型
- Accept-Language 指定客户端能够接受的语言类型
- Accept-Ecoding 指定客户端能够接受的编码类型
- User-Agent 用户代理,向服务器说明自己的操作系统、浏览器等信息
- Connection 是否开启持久连接(keepalive)
- Host 服务器域名
- ...
3.主体部分就是报文的具体数据。
附 get方法和post方法的区别
1.GET 一般用于信息获取,比如刚才我们浏览百度首页,其使用的就是GET方法。GET 请求一般不会产生副作用,它仅仅只是获取资源信息,就像数据库查询一样,不会修改、增加数据,不会影响资源的状态,并且对同一个 URL 的多次GET请求应该返回相同的结果。
而 POST 请求表示可能会修改服务器上的资源。
2.GET 和 POST 请求参数位置不同,GET 请求对应的参数放在 URL 中,而 POST 请求对应的参数放在 HTTP 请求主体中。(但是这只是一种约定,GET 请求中出现 Body 也是被允许的)
3.GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。处于安全考虑,在一些涉及安全的请求比如:登录请求需要用 POST 提交表单,而GET 请求一般用来获取静态资源。
可用Chrome开发者工具来对HTTP请求进行查看
2.HTTP响应
HTTP 响应是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,HTTP 响应和 HTTP 请求相似,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。
HTTP响应报文:
image.png报文实例:
image.png1.响应报文的起始由状态行构成,用来说明服务器做了什么,由<Version>、<Status-Code>、<Phrase>三个字段组成,同样的每个字段之间留有空格;
状态行中包含一个状态码,用来表示服务器对客户端响应的结果。
状态码一般由3位构成:
1xx : 表示请求已经接受了,继续处理。
2xx : 表示请求已经处理掉了。
3xx : 重定向。
4xx : 一般表示客户端有错误,请求无法实现。
5xx : 一般为服务器端的错误。
比如常见的状态码:
200 OK 客户端请求成功。
301 Moved Permanently 请求永久重定向。
302 Moved Temporarily 请求临时重定向。
304 Not Modified 文件未修改,可以直接使用缓存的文件。
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized 请求未经授权,无法访问。
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。
404 Not Found 请求的资源不存在,比如输入了错误的URL。
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
2.首部由多个响应头(也叫首部行)组成, 首部字段名如下,不全:
- Server 服务器软件名,Apache/Nginx
- Date 服务器发出响应报文的时间
- Last-Modified 请求资源的最后的修改时间
- ...
4.主体部分是响应报文的具体数据。
可用Chrome开发者工具来对HTTP响应进行查看
知道了 HTTP 请求和响应后,一个完整的流程一般是这样的:
通常,由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
附
用 curl 创造一个请求,并得到响应
例如:curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"
网友评论