標籤:
在平時測試當中經常會遇到使用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 opener22 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要求標頭
Python請求自動處理cookie