HTTP 协议是用来指导服务器和浏览器之间如何进行沟通的,一般来说端口默认是 80
。浏览器通过向服务器发送 HTTP 请求,来请求服务器中的资源。服务器根据这个请求,返回相应的响应。最后浏览器下载这个响应的实体内容。
HTTP请求
根据 RFC 2616 的第五章 Request ,一个请求基本包括请求行、请求头、 CRLF 至少这三部分内容,有时还有第四部分请求实体。
例如,我们使用下列命令向 https://www.baidu.com
发送 POST 请求(点击查看命令的解释),可以看到它的请求报文如下图所示:1
curl -X POST -d '{"name":"caijialinxx"}' -H 'Content-Type: application/json' -s -v https://www.baidu.com
- 第一部分即为请求行,分别包括
请求方法
、请求URI
、HTTP版本
,它们之间使用英文空格SP
分隔,此外,最后是一个换行符CRLF
。 - 第二部分是以
key: value
形式组成的请求头。其中包括 request-header (如Host
User-Agent
Accept
)和 entity-header (如Content-Type
Content-Length
)。每一对key: value
请求头后也都有一个CRLF
。 - 第三部分是固定不变的单独一行
CRLF
,用于分隔第二部分和第四部分。 - 第四部分是发送请求时带上的请求实体,即
{"name":"caijialinxx"}
。命令行在第二部分中添加的Content-Type: application/json
请求头,标示着第四部分是 JSON 格式的数据。
我们发送请求的方法有以下几种:
- GET
GET 方法是 HTTP 请求中最常用的方法,通常用于请求服务器中的某个资源。此方法应只用来获取数据。 - HEAD
HEAD 方法与 GET 方法类似,但是服务器在响应中只返回头部,而不返回响应实体。 - POST
此方法最初是用来向服务器输入数据的。实际上经常与 HTML 表单结合使用,表单被提交时,数据通常被附加到请求实体中发送给服务器。 - PUT
此方法让服务器用请求的实体部分来创建一个由请求中的 URL 命名的新文档,如果这个 URL 已存在,那么此次请求的主体会替代原有的主体。 - PATCH
用于请求服务器修改指定资源的某个部分。 - DELETE
向服务器请求删除指定 URL 对应的资源。 - OPTIONS
请求 Web 服务器告知其支持的各种功能,如支持的方法或对请求某些资源支持的方法。 - CONNECT
建立一个到由目标资源标识的服务器的隧道。 - TRACE
沿着到目标资源的路径执行一个消息环回测试。
HTTP响应
根据 RFC 2616 的第六章 Response ,一个响应包括状态行、响应头、 CRLF 和响应实体。
在上一部分中(HTTP 请求),我们向 https://www.baidu.com
发送了一个 POST 请求,它紧接着返回了响应给我们,让我们来看看它的响应报文:
- 第一部分即为状态行,分别包括
HTTP版本
、状态码
、状态解释
,它们之间使用英文空格SP
分隔,此外,最后是一个换行符CRLF
。在此报文中我们可以看到状态码是302
,表示页面暂时被另一个 URI 所替代,但客户端在未来的请求中仍应使用当前请求的 URI 。 - 第二部分是以
key: value
形式组成的响应头。其中包括 general-header (Connection
,Date
) 、 response-header (ETag
,Server
) 和 entity-header (Content-Type
,Content-Length
) 。每一对key: value
请求头后也都有一个CRLF
。 - 第三部分是固定不变的单独一行
CRLF
,同请求报文的第三部分。 - 第四部分是响应实体。在此报文第二部分中我们可以看到
Content-Type: text/html
响应头,表明第四部分是一个 HTML 文档,它有 3824 字节长度的数据。
关于状态码的详解,请参考我的另一篇文章 一些常见的 HTTP 状态码 。
如何使用开发者工具查看报文
作为一个前端开发人员,学会用开发者工具分析请求是一件很有帮助且不费时间的事情。下面,我将举例如何在 Chrome 中利用开发者工具查看请求报文和响应报文:
- 按下 F12 即可打开开发者工具。
点击 Network ,当访问一个网页时,这里将会出现很多请求结果。我以阮一峰老师的个人网站为例,在地址栏中输入
www.ruanyifeng.com
,然后可以看到如下请求结果:我们点开第一个
www.ruanyifeng.com
,点击 Request Header 中的 view source,这才是我们该看的格式。于是它的请求报文如下:- 浏览器使用
GET
方法向http://www.ruanyifeng.com
发送一个请求,并告诉服务器它接受的响应实体类型、 Cookie 等请求头信息。
- 浏览器使用
然后同样的,点开 Response Header 中的 view source ,看到服务器发回的响应报文如下所示:
- 服务器返回状态码
302
,告诉我们这个域名被响应头Location
指向的 URI 所暂时替代,并自动完成了重定向,于是得到了第二个请求结果(箭头指向的红框)。
- 服务器返回状态码
查看重定向的请求结果:
- 重定向使得浏览器重新向服务器请求
http://www.ruanyifeng.com/home.html
这个资源,在 Response Headers 中我们可以看到此次请求成功(状态码为200
),并且返回的响应实体是一个 HTML 文档,也就是我们看到的这个网页,一共有 4346 字节的内容。这个网页最后一次更新是在格林尼治的 2018-5-24 星期四 05:56:54 等信息。
- 重定向使得浏览器重新向服务器请求
现在应该知道要如何利用开发者工具查看我们的网络请求了吧~ 好处你用过就知道~ 当然开发者工具还不只有这些功能,在这里我就不做深入研究。
天色已晚,本文完。
若文中有错误还请指正与包涵!
原文链接:https://caijialinxx.github.io/2018/09/09/http-request-and-response/
转载请注明出处。
参考资料:
- HTTP 请求方法 —— MDN
- HTTP 协议之请求
- HTTP 协议之响应
- HTTP 协议之状态码