接口自动化(一)~(三)request,pytest库练习源码:https://download.csdn.net/download/qq_38175040/20367536
首先需要了解HTTP的基础知识。我之前也做过相关的功课,写过关于HTTP协议的几篇博客:https://blog.csdn.net/qq_38175040/category_10218858.html
一.HTTP的基础知识
一个HTTP请求主要有三个部分组成:
- 请求首行:请求的方法,要访问的资源,以及使用的HTTP版本
- 请求头:附带使用服务器所需要的附加信息
- 请求体:包含返回的数据,比如json等数据
请求首行:
请求头:
请求体:
响应头:
响应码:
- 5xx:服务器错误,服务器不能实现的一种明显的无效请求
501:收到服务器不支持实现的请求,如put请求,有些服务器不支持实现
502:服务器作为网关或代理,为处理请求,访问下一个服务器,但该服务器返回了非法的应答
503:服务器未能应答
504:服务器超时
505:服务器不支持HTTP请求的版本 - 4xx:客户端错误,请求包含语法错误或者请求无法被实现
400:请求出现语法错误
401:未授权
403:服务器拒绝执行
404:页面或资源不存在
405:请求对指定的资源不适用 - 3xx:重定向,为完成请求,还需进一步执行动作
- 2xx:请求成功
- 1xx:收到请求,处理请求中
HTTP在面试中一个常见的面试题:在浏览器中输入url后会发生什么?
这个问题在我的HTTP协议里的第一篇提到了一小部分:https://blog.csdn.net/qq_38175040/article/details/107907513
- 首先服务器有自己的ip地址,但ip地址对人来说很难记,所以人会在浏览器里输入域名,然后经过DNS解析为ip,访问对应的服务器
- 与服务器发起三次握手
- 建立链接TCP链接,发起HTTP请求
- 服务器响应HTTP请求,返回响应报文
- 浏览器渲染展示页面
- 断开TCP链接,四次挥手
为什么要四次挥手?
关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,因为可能正在传输报文,要把这段传输结束
所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
故需要四步挥手。
二.requests库
相关基础知识:https://blog.csdn.net/qq_38175040/article/details/114836043
安装好requests模块
新建一个项目,然后在项目下新建一个.py文件
发送get请求
get请求的常用知识
import requests
url = 'http://www.baidu.com'
#访问网址,返回一个response对象
res = requests.get(url)
print(res.text)
# get请求添加请求头
headers = {'token':'123','username':'Mercer'}
res = requests.get(url,headers=headers)
print(res)
# get请求 添加数据
data = {'username':'mercer','xx':'ssr'}
res = requests.get(url,params=data,headers=headers)
print(res.url)
发送post请求
post请求中发送表单数据(不能同时传表单和json)
post请求发送json数据
# post请求 提交表单形式的数据
form_data = {'key_1':'value_1','key_2':'value_2'}
# 这是一个测试网站
url = 'http://httpbin.org/post'
res = requests.post(url,data=form_data)
print(res.text)
# post 请求传递json格式的数据
json_data = {'key_01':'value_01','key_02':'value_20'}
res = requests.post(url,json=json_data)
print(res)
print(res.text)
# 有种post请求类似 http://xxx.com/username=xxx
data = {'username':'mercer','xx':'ssr'}
res = requests.post(url,params = data)
print(res.text)
print(res.url)
贴一下post请求发送普通表单和json的区别:https://zhuanlan.zhihu.com/p/202978890
上传文件
响应
传递cookie
也是和前面一样,cookie以字典的形式保存
请求失败
在请求过程中可能会因为超时,域名无效,服务器故障等多种原因导致请求失败
request库的基础内容大致如上,贴一下demo.py的代码:
import requests
url = 'http://www.baidu.com'
#访问网址,返回一个response对象
res = requests.get(url)
print(res.text)
# get请求添加请求头
headers = {'token':'123','username':'Mercer'}
res = requests.get(url,headers=headers)
print(res)
# get请求 添加数据
data = {'username':'mercer','xx':'ssr'}
res = requests.get(url,params=data,headers=headers)
print(res.url)
# post请求 提交表单形式的数据
form_data = {'key_1':'value_1','key_2':'value_2'}
# 这是一个测试网站
url = 'http://httpbin.org/post'
res = requests.post(url,data=form_data)
print(res.text)
# post 请求传递json格式的数据
json_data = {'key_01':'value_01','key_02':'value_20'}
res = requests.post(url,json=json_data)
print(res)
print(res.text)
# 有种post请求类似 http://xxx.com/username=xxx
data = {'username':'mercer','xx':'ssr'}
res = requests.post(url,params = data)
print(res.text)
print(res.url)
# 上传文件
file = {'file':open('Files/a.txt','rb')}
res = requests.post(url,files = file)
print(res.text)
print(res.encoding)
# 以二进制的形式返回
print(res.content)
# 将返回结果解码为json
print(res.json())
print(res.status_code)
# 打印响应头
print(res.headers)
# 传递cookie
cookie = {'my_cookie':'test'}
res = requests.post(url,cookies = cookie )
print(res.text)
# 请求失败
url = 'http://www.djfia.com'
res = requests.get(url)
print(res.text)
url = 'http://www.baidu.com'
res = requests.get(url,timeout = 0.001)
print(res.text)