1、接口的定义
1.接口是前后端沟通的桥梁,是数据传输通道,包括外部接口、内部接口,内部接口又包括:上层服务与下层服务接口、同级接口;
2.接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式;
2.什么是接口?
接口的种类分为内部接口、外部接口,内部接口又分为上层服务与下层服务、同级服务
1.按用途:
- 2 个不同的事物连接的桥梁,不同的事物就可以进行数据通信;
- UI , user interface是一种软件接口 ;
2.按结构:
- Graphical User Interface),是人与程序的接口;
- ( Application Programming Interface)是指外部系统与系统之间以及内部各子系统之间的交互点;
3.常见的接口类型
1.HTTP接口:基于超文本传输协议(HyperText Transfer Protocol HTTP)开发的接口,是应用最广泛的网络协议之一,但并不排除没有 使用其他协议。基于浏览器/服务器(Brower/Server)的软件系统大多数为HTTP接口;
2.Web Service接口:系统对外的接口,根据提供的方法引用提供的接口,从而获取数据;
3.RESTful接口:简称REST,描述了一个架构式的网络系统;
3、什么是HTTP
1.什么是HTTP?
超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应用层协议,是在 Web 上进行数据交换的基础,是一种 client-server 协议。
- 协议构建于 TCP/IP 协议之上,是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的请求。
- 是属于应用层的协议,它被设计用于Web浏览器和Web服务器之间的通信,也可以用于其他目的。
- 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。
- 是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于TCP / IP层,但可以在任何可靠的传输层上使用; 也就是说,一个不会静默丢失消息的协议,如UDP。请求通常是由像浏览器这样的接受方发起的。
- Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
- TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑)之间进行任何一种通信都必须按照Http协议进行,否则无法连接。
2.HTTP请求特点?
1.支持客户端/服务器模式:客户端发送请求,服务器端响应数据。客户端向服务器请求服务时,只需要传送请求的方法和路径即可。常用的请求方法有get(查)、post(增),除此之外还有put(改)、delete(删)等,每种方法规定的客户端与服务器联系的方式不同,日常工作中见到的最多的是get和post两种。
2.简单灵活:HTTP简单,服务器的程序规模小,通信速度快;HTTP使用TCP作为它的支撑运输协议,HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP,HTTP运行传输任意类型的数据对象。
3.无状态:协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,(一刀两断,恩断义绝,从此路人)下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。
4.无连接:限制每次连接,使其只处理一个请求。服务器处理完客户端的请求并收到客户端的应答后,即断开连接,这种方式可以节省传输时间。
3.HTTP与HTTPS的区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(SecureSocketsLayer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTP与HTTPS都是应用层协议,且本质上没有什么不同。他们的区别相对来说就是HTTPS是HTTP的安全版,HTTP信息是明文传输,而HTTPS是具有安全性的SSL加密传输,安全性要高于HTTP协议。且两者使用的端口也不一样,HTTP默认使用80端口,而HTTPS使用443端口
。
HTTPS和HTTP的区别主要如下:总的来说:HTTPS=SSL+HTTP
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(这个只是默认端口不一样,实际上端口是可以改的)
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
4.什么是接口测试?
接口测试就是基于http协议的接口测试。除了基于http协议的接口,还有基于其他协议的接口,其本质都是要发送一个http请求报文给服务器,然后服务器返回一个http响应报文。
5.常见的请求方式
GET请求
它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
格式:请求数参数写在网址后面,用"?"连接,多个参数之间用"&"连接;
场景:get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来;
特点:1)请求数据量小,2)参数暴露于url地址中,故存在安全隐患。
POST请求
post向服务器提交数据,这个方法用途广泛,几乎目前所有的提交操作都是靠这种方式完成。它用来向指定资源提交数据进行处理请求(例如:提交表单和上传文件),数据包被包含在请求体中,post请求可能导致新的资源的建立或者已有的资源的修改。
说明:向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立。
场景:如注册、上传、发帖等功能,如用户在豆瓣网站对某本书进行收藏、写笔记、发表评论。
特点:请求数据量大,安全性高
get请求与post请求的区别
1.提交数据的形式
- 方法一般是指获取服务器上的数据,请求参数(query string查询字符串)直接跟着URL后边,以?分割URL和传输数据,参数之间以&相连(?key1=value1&key2=value2)的形式,直接可以放到浏览器地址栏里,例如登录就是采用方法。
如:login.actionname=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
- 方法是指客户端给服务器上提交表单数据,会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数,所以是通过表单提交的,请求参数放在body中,如网页上的新用户的注册、调查问卷和答题就是采用POST方法。
2.提交数据的大小/长度
- 是直接在浏览器地址栏输入,直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响:比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。由于浏览器有限制,一般整个URL的长度可以很长,但是不能超过2049KB的大小限制,而post没有大小限制。
- 方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。所以大小的限制还是得受各个web服务器配置的不同而影响。
3.提交数据的安全性
- get的参数是在浏览器地址栏URL直接拼接,用户名和密码将明文出现在URL上,暴露在互联网中,安全性差,不能用来传递敏感信息。
- 请求参数放在body里,是通过表单数据提交,比get方式的安全性要高。
get方式安全性弱因为以下几个原因:
(1)登录页面有可能被浏览器缓存;
(2)其他人查看浏览器的历史纪录,那么别人就可以拿到账号和密码;
(3)当遇上跨站的攻击时,安全性的表现更差;
4.编码方式
- 的参数只能支持ASCII;
- 没有限制,也允许二进制数据;
5.请求方式
- 是获取指定的资源
- 是向指定的资源提交要被处理的数据
6.请求体
- 没有请求体;
- 有请求体;
7.效率方面
- 产生一个tcp数据包;
- 产生两个tcp数据包,需要两步,时间上消耗要多一点,get比post更有效;
8.请求过程
- get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据),get请求的过程:
1.浏览器请求tcp连接(第一次握手);
2.服务器答应进行tcp连接(第二次握手);
3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http 会在此时进行第一次数据发送);
4.服务器返回200OK响应;
- post,浏览器先发送header,服务器响应100continue,浏览器再发送data,服务器响应200ok(返回数据),post请求的过程:
1.浏览器请求tcp连接(第一次握手);
2.服务器答应进行tcp连接(第二次握手);
3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在 此时进行第一次数据发送);
4.服务器返回100 Continue响应;
5.浏览器发送数据;
6.服务器返回200 OK响应;
问:浏览器中输入地址经过那些流程?
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5.释放 TCP连接;
6.浏览器将该 html 文本并显示内容;
6.接口测试流程
7.设计接口测试用例
1.功能是否正常 功能是否按照接口文档实现(参数) 2.逻辑 是否依赖业务 3.异常:参数异常/数据异常 参数异常:关键字参数错误、参数为空、多或少参数、错误参数 数据异常:关键字数据错误、数据为空、长度不一致、错误数据
8.常见接口测试工具
抓包工具:Fiddler、Firebug、HTTP Analyzer 发包工具:开源工具:jmeter、postman,商业工具:loadrunner、soapui
9.GET请求
一、环境安装
1.用pip安装requests模块
>>pip install requests
二、get请求
1.导入requests后,用get方法就能直接访问url地址,如:http://www.cnblogs.com/yoyoketang/,看起来是不是很酷
2.这里的r也就是response,请求后的返回值,可以调用response里的status_code方法查看状态码
3.状态码200只能说明这个接口访问的服务器地址是对的,并不能说明功能OK,一般要查看响应的内容,r.text是返回文本信息
import requests re = requests.get("http://www.baidu.com") print(re.status_code) print(re.text)
语法格式:requests.get(url, params=None, **kwargs) 如:requests.get(url=url, headers=headers, params=params) url:请求url地址 headers:请求头 params:参数
简单使用 获取响应状态码: res.status_code 获取响应消息: res.content 获取请求头: res.request.headers 获取响应头: res.headers 获取响应数据 res.text 响应结果一般有三种格式:html、json、text; 获取cookie res.cookies cookie是一种类字典的数据格式,若想打印字典的值,可以根据key; res.json():如果返回结果是json格式,可以把响应结果利用json()来进行解析;
三、params
1.再发一个带参数的get请求,如在博客园搜索:yoyoketang,url地址为:http://zzk.cnblogs.com/s/blogpost?Keywords=yoyoketang
2.请求参数:Keywords=yoyoketang,可以以字典的形式传参:{"Keywords": "yoyoketang"}
3.多个参数格式:{"key1": "value1", "key2": "value2", "key3": "value3"}
import requests par = {"a":"b"} re = requests.get("http://www.baidu.com",params=par) print(re.status_code) print(re.text)
四、content
1.百度首页如果用r.text会发现获取到的内容有乱码,因为百度首页响应内容是gzip压缩的(非text文本)
五、response
1.response的返回内容还有其它更多信息
-- r.status_code #响应状态码-- r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩-- r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None -- r.json() #Requests中内置的JSON解码器-- r.url # 获取url-- r.encoding # 编码格式-- r.cookies # 获取cookie -- r.raw #返回原始响应体 -- r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码 -- r.raise_for_status() #失败请求(非200响应)抛出异常
10.POST请求
一、查看官方文档
1.学习一个新的模块,其实不用去百度什么的,直接用help函数就能查看相关注释和案例内容。
>>import requests
>>help(requests)
2.查看python发送get和post请求的案例
- json是str还是dict,如果不指定headers中的content-type,默认为application/json;
- 为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式;
- 为str时,如果不指定content-type,默认为application/json。
二、发送post请求
1.用上面给的案例,做个简单修改,发个post请求
2.payload参数是字典类型
import requests payload = {"q":"b"} re = requests.post("http://www.baidu.com",data=payload) print(re.text)
三、json
1.post的body是json类型,也可以用json参数传入。
2.先导入json模块,用dumps方法转化成json格式。
3.返回结果,传到data里
import requests,json payload = {"q":"b"} data_json = json.dumps(payload) re = requests.post("http://www.baidu.com",json=payload) print(re.text)
四、headers
1.这里需添加请求头headers,可以用fiddler抓包
headers = {"Content-Type": "application/json; charset=utf-8"}
五、超时
timeout
requests 发请求的时候会有个默认的超时时间,这个时间在20秒左右
import requests s = requests.session() url = "https://www.github.com/" r = s.request("GET", url=url) print(r.text)
连不上服务器会出现异常:requests.exceptions.ConnectionError
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.github.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x0000020F06524AC8>: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',))
如果请求一直没响应,进入假死状态,可以加个 timeout 超时时间,达到这个请求超时时间就结束,如 15 秒超时。
import requests s = requests.session() url = "https://www.github.com/" r = s.request("GET", url=url, timeout=15) print(r.text)
这样抛出的异常是:requests.exceptions.ConnectTimeout
raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='www.github.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x000001CF6D2A4A20>, 'Connection to www.github.com timed out. (connect timeout=15)'))
失败重试 max_retries
Requests 自带了一个传输适配器,也就是 HTTPAdapter。 这个适配器使用了强大的 urllib3,为 Requests 提供了默认的 HTTP 和 HTTPS 交互。 每当 Session 被初始化,就会有适配器附着在 Session 上,其中一个供 HTTP 使用,另一个供 HTTPS 使用。
import time import requests from requests.adapters import HTTPAdapter s = requests.Session() s.mount('http://', HTTPAdapter(max_retries=3)) s.mount('https://', HTTPAdapter(max_retries=3)) print(time.strftime('%Y-%m-%d %H:%M:%S')) try: r = s.get('http://www.google.com.hk', timeout=10) print(r.text) except requests.exceptions.RequestException as e: print(e) print(time.strftime('%Y-%m-%d %H:%M:%S'))
这样每次请求超时10s,超时后会重试3次,最大请求时长40s.
Cookie和Session的区别?
Cookie 是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。另外一个更准确的说法是:Cookie 是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,是一种在客户端保持状态的方案。由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是 Session。
Cookie和Session是解决http协议的无状态性,区别如下:
1.存储位置不同:Cookie是将用户数据通过加密的方式保存在客户端,大多数情况Cookie存储在浏览器;Session是用于控制客户端和服务端的连接,Session存储在服务器;
2.存储容量不同:单个Cookie保存的数据不得超过4kb,一个站点最多20个Cookie,Session一般情况下没有上限,不过建议不要存放太多东西,否则影响性能;
3.存取方式不同:Cookie只能用ASCII字符串,通过编码方式获取Unicode字符或者二进制数据,不好存储复杂的信息,而Session能存储任何类型的数据;
4.隐私策略/安全性不同:Cookie放在客户端,可以进行Cookie欺骗,所以不安全,Session放在服务端,更加安全;
5.有效期不同:Cookie可以设置属性达到长期有效,Session依赖于JSESSIONID的Cookie,Cookie JSESSIONID的过期时间默认为-1,只需要关闭窗口Session就会失效,就算不依赖Cookie,用UrL重写也不能完成,如果Session超时时间过长,容易导致内存溢出;
6.服务器压力不同:Cookie保存在本地,不存在服务端压力,Session保存在服务端,每个用户产生一个Session,当访问增多,会比较占用服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用Cookie;
7.浏览器支持不同:如果浏览器禁用Cookie,那么Cookie直接失效,Session比较好点,可以用URL重写;
8.cookie和session应用的场景:
cookie:用户的登录状态,记录用户的习惯,购物车;
session:登录验证;