HTTP简介
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。HTTP协议在网络OSI模型中属于应用层协议,应用层协议除了HTTP还有:FTP,SMTP,DNS,RIP,Telnet等。
HTTP协议工作于客户端—服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端(即Web服务器)发送请求。
超文本
超文本英文名称叫做 Hypertext,我们在浏览器里面看到的网页就是超文本解析而成的,其网页源代码是一系列 HTML 代码,里面包含了一系列标签,如 img 显示图片,p 指定显示段落等,浏览器解析这些标签后便形成了我们平常看到的网页,而这网页的源代码 HTML 就可以称作超文本。
例如我们在 Chrome 浏览器里面打开如百度页面,右键点击”查看源代码”,这些源代码都是超文本。
URL
我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址(如:http://www.51zxw.net)。当你在浏览器的地址框中输入一个URL
或是单击一个超级链接时,URL
就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。
HTTP功能
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP特点
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
媒体独立:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type来传输。 详见:MIME 参考手册
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。如果服务器不需要先前信息,那么它的应答就比较快。但是缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,此时可以设置缓存。
HTTP与HTTPS
现在在浏览很多网站时,通过浏览器地址栏可以看到有的网站是https开头(https://www.baidu.com/ ), 但是有的是http开头(如:http://www.weather.com.cn )这两种有什么区别呢?难道加了s就是复数吗?
HTTPS 的全称是 Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层(Secure Sockets Layer 安全套接层),简称为 HTTPS。S其实是Security单词的首字母。
HTTPS 的安全基础是 SSL,因此通过它传输的内容都是经过 SSL 加密的,它的主要作用可以分为两种:
1.是建立一个信息安全通道,来保证数据传输的安全。
2.确认网站的真实性,凡是使用了https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。
现在越来越多的网站和 APP 都已经向 HTTPS 方向发展。例如:谷歌从 2017 年 1 月推出的 Chrome 56 开始,对未进行 HTTPS 加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”。
HTTP与TCP/IP的区别
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
HTTP请求过程
我们在浏览器输入百度首页的地址:https://www.baidu.com/ 输入之后浏览器会给我们打开百度首页。实际上这个过程是浏览器向网站所在的服务器发送了一个 Request,即请求,网站服务器接收到这个 Request 之后进行处理和解析,然后返回对应的一个 Response,即响应,然后传回给浏览器,Response里面就包含了页面的源代码等内容,浏览器再对其进行解析便将网页呈现了出来。
Request
Request,即请求,由客户端向服务端发出。可以将 Request 划分为四部分内容:
Request Method: 请求方式
Request URL: 请求链接
Request Headers: 请求头
Request Body: 请求体
Request Method
请求方式,请求方式常见的有两种类型,GET 和 POST。
GET 用于信息获取,而且应该是安全的和幂等的(幂等的的意思就是一个操作不会修改状态信息,并且每次操作的时候都返回同样的结果。) 从发送请求的角度,GET 请求相当于我们在数据库中做了查询的操作,这样的操作不影响数据库本身的数据。
POST 表示可能会修改服务器上资源的请求,也相当于在数据库中做了修改的操作,会影响数据库本身的数据(比如:注册了账户,发了帖子,做了评论,得到了积分等。这种情况下,资源状态被改变了)。
案例1——GET请求
在浏览器输入:https://www.baidu.com/s?wd=appium 并回车,这个其实就是在百度搜索appium这个关键词。URL 中包含了请求的参数信息,这里参数wd 就是要搜寻的关键字。在浏览器可以看到Query String Parameters 选项就是请求的参数。发起一次GET请求时,参数会以url string的形式进行传递。即?后的字符串则为其请求参数,并以&作为分隔符。
案例2——POST请求
一般来说,网站登录验证的时候,需要提交用户名密码,这里包含了敏感信息,使用GET方式请求的话密码就会暴露在URL里面,造成密码泄露,所以这里最好以POST方式发送。文件的上传时,由于文件内容比较大,也会选用POST方式。比如百度账户登录,如下图所示:
除了常规的GET,POST请求,另外还有一些请求方式,如 HEAD、PUT、DELETE等,简单将其总结如下:
Request URL
Request URL就是请求的网址,即统一资源定位符,用 URL 可以唯一确定我们想请求的资源。比如:https://www.baidu.com/
Request Headers
请求头,用来说明服务器要使用的附加信息,比较重要的信息有 Cookie、Referer、User-Agent 等,下面将一些常用的头信息说明如下:
Accept
,请求报头域,用于指定客户端可接受哪些类型的信息。
Accept-Language
,指定客户端可接受的语言类型。
Accept-Encoding
,指定客户端可接受的内容编码。
Host
,用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,Request 必须包含此内容。
Cookie
,也常用复数形式 Cookies,是网站为了辨别用户进行 Session 跟踪而储存在用户本地的数据。Cookies 的主要功能就是维持当前访问会话。
Referer
,此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、做防盗链处理等。
User-Agent
,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息可以伪装为浏览器,如果不加很可能会被识别出为爬虫。
Content-Type
,即 Internet Media Type,互联网媒体类型,也叫做 MIME 类型,在 HTTP 协议消息头中,使用它来表示具体请求中的媒体类型信息。例如 application/x-www-form-urlencoded表示表单数据, text/html 代表 HTML 格式,image/gif 代表 GIF 图片,application/json 代表 Json 类型,
Request Body
即请求体,一般用于POST请求中,主要定义向服务器提交的数据类型,而对于 GET 请求 Request Body 则为空。
比如在登录之前我们填写了用户名和密码信息,提交时就这些内容就会以 Form Data 的形式提交给服务器,此时注意 Request Headers 中指定了Content-Type 为 application/x-www-form-urlencoded,只有设置 Content-Type 为 application/x-www-form-urlencoded才会以 Form Data 形式提交,另外我们也可以将 Content-Type 设置为 application/json 来提交 Json 数据,或者设置为 multipart/form-data 来上传文件。
常用Content-Type 和 POST 提交数据方式的关系:
Content-Type| 提交数据方式
—|—
application/x-www-form-urlencoded| Form 表单提交
multipart/form-data |表单文件上传提交
application/json| 序列化 Json 数据提交
text/xml| XML 数据提交
application/x-www-form-urlencoded与multipart/form-data 区别
在没有type=file时候,用默认的 application/x-www-form-urlencoded 就行。
在有 type=file 时候,要用multipart/form-data编码方式。浏览器会把表单以控件为单位分割,并且为每个部分加上Content-Dispositon(form-data或file)、Content-Type(默认text/plain)、name(控件name)等信息,并加上分割符(boundary)。
Response
Response,即响应,由服务端返回给客户端。Response 可以划分为三部分:
Response Status Code
Response Headers
Response Body
Response Status Code
响应状态码,此状态码表示了服务器的响应状态,如200 则代表服务器正常响应,404 则代表页面未找到,500 则代表服务器内部发生错误。常用响应状态码如下:
Response Headers
响应头,其中包含了服务器对请求的应答信息,如 Content-Type、Server、Set-Cookie 等,下面将一些常用的头信息说明如下:
Date
,标识 Response 产生的时间。
Last-Modified
,指定资源的最后修改时间。
Content-Encoding
,指定 Response 内容的编码。
Server
,包含了服务器的信息,名称,版本号等。
Content-Type
,文档类型,指定了返回的数据类型是什么,如text/html 则代表返回 HTML 文档,application/x-javascript 则代表返回 JavaScript 文件,image/jpeg 则代表返回了图片。
Set-Cookie
,设置Cookie,Response Headers 中的 Set-Cookie即告诉浏览器需要将此内容放在 Cookies 中,下次请求携带 Cookies内容。
Expires
,指定 Response 的过期时间,使用它可以控制代理服务器或浏览器将内容更新到缓存中,如果再次访问时,直接从缓存中加载,降低服务器负载,缩短加载时间。
Response Body
即响应体,响应的正文数据都是在响应体中,如请求一个网页,它的响应体就是网页的 HTML 代码,请求一张图片,它的响应体就是图片的二进制数据。一般在接口的响应内容大多都是Json数据内容.
本文作者:Sutune
本文链接: 2018/07/10/http/
如果对软件测试有兴趣,想了解更多的测试知识,解决测试问题,以及入门指导,帮你解决测试中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己测试方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们1079636098,群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!