Python请求自动处理cookie
在平时测试当中经常会遇到使用python脚本来模拟http请求的操作,在做一次接口【http请求,返回json】测试时,开发提供的http接口在请求时,会被filter拦截,验证请求者的session是否合法,由于我们是直接请求,没有附带任何的cookie与headers,那如何让我们合法的进行接口的请求,并继续测试呢?详见下面描述:
在使用系统之前,我们都会经过一个登录的操作,这个登录操作就会把我们的sessionId的状态属性设置为合法【不同的系统,细节不同,大体都类似】,我们要是想直接请求接口,并需带上一个合法的sessionId在我们的cookie中,如何去做呢?
有以下几种方法:
1、人工准备一条合法的sessionId,在请求时放入到cookie中。缺点:需要人工准备,而且sessionId还会过期。
2、模拟登录请求,在响应头部里set cookie中将sessionId扣出来,下次请求时带上。缺点:需要在响应头部中处理set cookie部分内容,若有大量的set cookie时,处理起来比较麻烦。
3、使用CookieJar,模拟登录请求,接着模拟接口请求。优点:简单方便。
第一种方法:这里不介绍,也不推荐。
第二种方法:可以参考http请求时添加请求头。
第三种方法:详见以下描述。
现有接口QueryVideoList:http://192.168.1.242:9000/QueryVideoList
QueryVideoList请求参数:{'catalogsID':'','catagoryCode':'','sortType':'desc','sortField':'Time','videoInfo':'','beginTime':'' ,'endTime':'' ,'pageSize':'20','pageIndex':'1'}
登陆时post的url:http://192.168.1.242:9000/
这个啥意思呢?你可以通过http请求监控工具,监控下登录的过程可以看到。推荐fiddler,登陆时会post用户名与密码,这个post的url就是登录的url,这个post操作主要就是将你的sessionId设为合法。
接下来我来直接上代码吧:
1 #coding:u8 2 import urllib 3 import urllib2 4 import cookielib 5 6 cookieJar=cookielib.CookieJar() 7 opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar)) 8 9 login_post_url = "http://192.168.86.242:9000/" 10 query_video_list_post_url = "http://192.168.1.242:9000/QueryVideoList" 11 12 login_post_data = {'username':'feixu','password':'000000','SysType':'1'} 13 query_video_list_post_data = {'catalogsID':'','catagoryCode':'','sortType':'desc','sortField':'Time','videoInfo':'','beginTime':'' ,'endTime':'' ,'pageSize':'20','pageIndex':'1'} 14 15 #urlencode编码 16 def encode_post_data(post_data): 17 return urllib.urlencode(post_data) 18 19 #post请求通用方法,使用全局变量opener,具体cookie收集功能 20 def post_fun(url,post_data): 21 global opener 22 req=urllib2.Request(url,encode_post_data(post_data)) 23 return opener.open(req) 24 25 #查询视频列表接口 26 def query_video_list(url,post_data): 27 return post_fun(url,post_data) 28 29 #登录,使cookie中指定的session变为合法 30 def login(url,post_data): 31 return post_fun(url,post_data) 32 33 login(login_post_url,login_post_data) 34 resp = query_video_list(query_video_list_post_url,query_video_list_post_data) 35 print resp.read()
首先我们创建了一个cookieJar,然后使用这个cookieJar构建了一个opener,也就是说,后期使用opener来进行请求时,会自动将cookie存入到cookieJar容器中,再继续请求时,会附带上一次存入的cookie,因此我们只需要使用opener来进行请求就行了,cookie的事,由cookieJar自动帮我们处理。
你需要处理的就是请求的url、请求的数据,除了cookie之外的headers请求头