request模块
- 文档 http://2.python-requests.org/zh_CN/latest/user/quickstart.html
- 安装
pip3 install request
- 引入
import request
发送http请求
import requests
#get请求
url="http://v.juhe.cn/laohuangli/d"
data={"date":"2019-09-14","key":"3078e34cb750268b324e6c982726d00f"}
response=requests.get(url) #返回一个消息实体
print(response) #<Response [200]> 消息实体 响应状态码、响应头、响应正文全部封装在里面
print("响应状态码:",response.status_code)
print("响应头:",response.headers)
print("响应正文:",response.text)
#post请求,该接口支持get和post
url_post="http://v.juhe.cn/laohuangli/d"
data={"date":"2019-09-14","key":"3078e34cb750268b324e6c982726d00f"}
response_1=requests.post(url,data) #返回一个消息实体
print("响应状态码:",response_1.status_code)
print("响应头:",response_1.headers)
print("响应正文1:",response_1.text,type(response_1.text)) #<class 'str'>
print("响应正文2:",response_1.json(),type(response_1.json())) #<class 'dict'>
#cookie
print("cookie:",response_1.cookies) #类字典形式,可以通过key获取值
print(response_1.cookies["aliyungf_tc"])
#headers
#请求头,响应中是拿不到请求头的,所以需要加.request
print("headers:",response_1.request.headers)
#{'User-Agent': 'python-requests/2.22.0'},由requests发出http请求
print("headers中的User-Agent:",response_1.request.headers["User-Agent"])
#篡改请求头中的参数,比如:某些网站限制只能通过浏览器发送请求,篡改User-Agent,伪装成浏览器
header={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)"}
response_2=requests.post(url,data,headers=header)
#篡改成功,伪装成浏览器发送请求
print("篡改后的User-Agent:",response_2.request.headers["User-Agent"])
- html\xml\json都可以用
.text
- html\xml使用
.json()
会报错,它只支持响应是json格式的输出,响应是json格式时推荐使用这个方式,方便取值,可以根据key取值 -
print("headers:",response_1.request.headers)
响应中是拿不到请求头的信息的,所以需要加.request
代码的封装
新建一个package,命名为API_AUTO
开始我们接口自动化之旅,该package下新建一个名为tools
的package,新建一个http_request
模块,利用request封装get请求和post请求。tools作为工具类,之后存放我们抽象出来的
"""
利用request封装get请求和post请求
"""
class HttpRequest:
'''
url:请求的地址 http:ip:port/path
param:传递的参数 非必填参数 字典格式传递参数
'''
def http_request(self):
url="http://v.juhe.cn/laohuangli/d"
data={"date":"2019-09-14","key":"3078e34cb750268b324e6c982726d00f"}
response_1=requests.post(url,data) #返回一个消息实体
print("响应状态码:",response_1.status_code)
print("响应头:",response_1.headers)
print("响应正文:", response_1.json())
# 测试
if __name__ == '__main__':
HttpRequest().http_request()
-
把刚才的代码直接封装成一个函数,但是无法进行不同的url、使用不同的data调用,所以将url、data、cookie等提取为通过参数传递
-
可能不同的接口需要提取的响应内容也不一样,改为返回一个消息实体,需要什么内容,再提取什么内容,而不是固定的打印响应状态码、响应头、响应正文
-
请求方式也不是固定post,也将它变为参数传递
import requests
class HttpRequest:
'''
利用request封装get请求和post请求
'''
def http_request(self,url,data,method,cookie=None):
'''
:param
@url:请求的地址 http:ip:port/path
@param:传递的参数 非必填参数 字典格式传递参数
:return
返回一个消息实体
'''
if method=="get":
response = requests.get(url,data,cookie)
else:
response=requests.post(url,data,cookie)
return response #函数的返回是一个消息实体
# 测试
if __name__ == '__main__':
url = "http://v.juhe.cn/laohuangli/d"
data = {"date": "2019-09-14", "key": "3078e34cb750268b324e6c982726d00f"}
res=HttpRequest().http_request(url,data,"post")
print("响应状态码:", res.status_code)
print("响应头:", res.headers)
print("响应正文:", res.json())
print("请求头:",res.request.headers)
网友评论