自学网络编程第一天- HTTP基础:基础原理、Request请求、Response应答
基础原理
我们通过浏览器浏览一个网站,其具体的流程是这样的:
- 浏览器向 URL 发送 HTTP 请求
- 服务器接收到请求,查看请求内容
- 根据请求内容准备数据
- 将数据以 HTTP 应答形式发回
- 浏览器收到应答,分析应答内容
- 根据应答内容渲染并呈现页面
- 用户进行操作
- 浏览器判断用户的操作,是发送给页面脚本处理还是发送回服务器处理
大致流程是这样的,但是具体上还有许多需要处理的细节,比如说URL的域名解析、HTTP的三次握手等。基于 HTTP 的网络编程大概的流程也是这样,所以 HTTP 请求和 应答是十分重要的部分。
Request 请求
request 请求是 HTTP 协议对服务端发送的一种特殊报文形式
请求格式
请求信息由3部分构成:
- 请求行:请求方法 URL 协议/版本
- 请求头:请求报文头部(Request Header)信息,放置一些给服务器使用的附加信息
- 请求体:请求正文
GET /sample.Jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=xxxxxx&password=xxxxxx
上方这个例子分为三部分,分别对应了 HTTP 请求信息的3部分构成。请求行,位置为第一行;请求头信息,位置为第二行到空行上方;请求体,位置为空行之下的所有。
注意:请求行中的请求方法、url、协议/版本需空格相隔。请求头每行为一条信息,使用键值对格式。
请求方式
HTTP 请求方式,HTTP1.0 定义了三种: GET, POST, HEAD;HTTP1.1 新增了六种:OPTIONS, PUT, PATCH, DELETE, TRACE, CONNECT
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
实际使用中,最常用的就是 GET 请求和 POST 请求。
GET 请求
get 请求是比较简单的 http 请求,直接会将发送给 web 服务器的数据放在请求地址的后面,适合于数据量少(根据浏览器不同限制不同,大概在4K左右),没有安全性要求的请求。
get 请求的参数是跟随在 url 之后的,以问号 ? 分隔 URL 和参数。参数名和参数值用等号 = 分隔,多个参数之间用 & 分隔。整个字符串是没有空格的。
get 请求的优点在于快速,便捷,请求参数都在 url 里,不需要另行解析。缺点在于传递的数据量少,且数据是显示传递,不能加密,易被解读,所以安全性差。
POST 请求
post 请求将需要发送给 web 服务器的数据经编码放到请求体中,可以传递大量数据,并且有一定的安全性,常用于表单提交。
post 请求安全性较高,可传输数据量大,数据种类多,但是请求速度慢。
请求头
请求头部信息写了一些发送给服务器的需要使用到的信息。常用的请求头信息有:
- Accept :客户端可以接受(能够使用)服务器回发的正文的格式信息
Accept: text/html 能够接受以文本方式写的 html 格式
Accept: */* 能够接受所有类型 - Accept-Encoding :客户端可以接受的编码方法,通常指压缩方法。常用的有 gzip, deflate, br 等
- Accept-Language :客户端可以接收的语言例
Accept-Language: zh-CN,zh;q=0.9 - Connection :客户端和服务器之间的连接方式
Connection: keep-alive :当一个网页打开后,TCP连接不会关闭。如果再次访问服务器上的网页,会继续使用这一条连接
Connection: close :当 Request 完成后,立刻关闭 TCP 连接。 - Host :主要用于指定被请求资源的主机和端口号,通常从 HTTP URL 中提取
- Referer :主要用于告诉服务器是从哪个页面跳转过来的
- User-Agent :客户端的操作系统和浏览器的名称、版本等信息
- Cache-Control :缓存控制,默认为private
Cache-Control: private :响应只能够作为私有的缓存,不能在用户间共享
Cache-Control: public :响应会被缓存,并在多用户间共享。正常情况下,如果要求 HTTP 认证,则响应会自动设置为 private
Cache-Control: must-revalidate :响应在特定条件下会被宠用,以满足接下来的请求,但是它必须到服务端去验证是不是仍是最新的
Cache-Control: no-cache :响应不会被缓存,而是实时向服务器端请求资源
Cache-Control: max-age=10 :设置缓存最大的有效时间,单位秒
Cache-Control: no-store :在任何条件下,响应都不会被缓存,且不会被写入到客户端的磁盘里。基于安全考虑的某些敏感响应会使用 - Cookie :发送存储的 Cookie 信息,多用来进行身份识别
- Range :用于断点续传
Range: bytes=0-5 :指定第一个字节的位置和最后一个字节的位置,告诉服务端想要获取的部分。
Response 应答(响应)
Response 是服务器对于 request 请求的回答,称为应答或响应
应答格式
类似请求信息的格式,应答信息也分为三部分:
- 状态行:协议 状态码 状态信息
- 响应头:响应报文头部(Response Header)信息,放置一些给客户端使用的附加信息
- 响应体:服务器返回的客户端真正要用的内容,例如 html,json 等
HTTP/1,1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
应答状态行为第一行,协议、状态码、状态信息使用空格分开。响应头为第二行至空行上一行,格式同请求头使用键值对格式。响应正文为空行下方所有。
响应状态码
具体的状态码和含义可以看这里:
响应头
响应头部信息写了一些发送给客户端的需要使用到的信息。常用的响应头信息有:
- Cache-Control : 对应请求头的 Cache-Control
- Content-Type : 回发资源文件的类型和字符编码,客户端根据这里的信息进行解码和解析。对应请求头的 Accept 。格式为 Content-Type: text/html;charset=UTF-8
- Content-Encoding :回发数据的编码(压缩)格式,对应请求头的 Accept-Encoding
- Date :服务器发送资源时的服务器时间,主要解决不同时区请求资源时的时间混乱问题
- Server :服务器信息及对应版本
- Transfer-Encoding :发送编码。服务器发送资源时候是分块的,一般发送的资源时服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送
Transfer-Encoding: chunked :服务器分块发送的资源每一块都是独立的,都能标示自己的长度,最后一块的长度是0。当客户端读取到0长度的块时,就确定资源已经传输完成了。 - Connection :回应请求头的 Connection。
- Last-Modified :所请求的对象的最后修改日期
- Etag :就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。
- Refresh :刷新,用于重定向
Refresh: 5;url=http://baidu.com :5秒后刷新重定向 - Access-Control-Allow-Methods :允许哪些方法来访问
Access-Control-Allow-Methods: GET,POST,PUT,DELETE
页面渲染
当浏览器发送一个请求后,收到应答,分析应答内容,然后将内容翻译为可供用户查看的页面,此过程成为页面渲染。页面渲染通常有两种方式:服务器渲染和客户端渲染。
服务器渲染
当服务器收到请求后,需要返回的数据和 html 信息整合在一起,统一返回给浏览器,这种方法就是服务器渲染。服务器渲染发回的就是能够直接呈现给用户的 html 信息,浏览器直接翻译就可以了。大部分网站使用的是这种方式。
浏览器渲染
当服务器收到请求后,只返回一个 html 的骨架,浏览器收到此 html 时,执行其附带的脚本,根据脚本再次向服务器请求数据。当浏览器收到返回的数据后,和之前收到的 html 骨架进行整合,再渲染呈现。这种方式就是浏览器渲染,它需要多次访问服务器。
基本上拉加载式的页面就是使用的浏览器渲染方式。
但是如果使用爬虫获取数据时,使用此种方式的页面可以直接获取数据而不用分析 html 信息,反而更方便。