引言
今天將的接口測試中常見的一種請求數據類型,key=value形式,並且以urlencode編碼方式去請求。可能有些人從未遇到過,因為如果接口沒有這樣定義或解析,是不需要這樣操作。
但是,有些接口請求的話,必須這樣轉換后,才可以請求。
背景
我就拿我實際工作中項目中的接口來講,如圖:
可以看出來,這個接口的body數據是以key=value形式,並且進行了urlencode編碼,body的數據類型是bytes,而不是str。
實操
在我之前文章https://www.cnblogs.com/liudinglong/p/12389650.html中講過requests庫中post方法請求參數的選擇,詳細介紹了如果key=value使用的是data。但是,沒有考慮到有些特殊接口需要轉碼的情況,在這里剛好遇到,就來講一遍。
這里我們需要使用python3中urllib庫,現在python2停更了,這里就再簡單復習一下urllib,urllib2,urllib3以及requests之間與python的關系。
python2.X 有這些庫名可用: urllib, urllib2, urllib3, httplib, httplib2, requests。
python3.X 有這些庫名可用: urllib, urllib3, httplib2, requests。
python3只要記住有個urllib,兩者都有的urllib3和requests, 它們不是標准庫. urllib3 提供線程安全連接池和文件post支持,與urllib及urllib2的關系不大. requests 自稱HTTP for Humans, 使用更簡潔方便。
python2 | python3 |
import urllib2、import urllib、urllib2.Request | import urllib.request,urllib.error,urllib.parse、urllib.request |
import urlparse | import urllib.parse |
import urlopen | import urllib.request.urlopen |
import urlencode | import urllib.parse.urlencode |
import urllib.quote | import urllib.request.quote |
cookielib.CookieJar | http.CookieJar |
對於上圖的http來分析,我們需要轉碼,就要使用urllib
中的urlencode
方法將字典編碼,用於提交數據給url
等操作。
Python3
中也有urllib
和urllib3
兩個庫,其中urllib
幾乎是Python2
中urllib
和urllib2
兩個模塊的集合,所以我們最常用的urllib
模塊,而urllib3
則作為一個拓展模塊使用。
方法如下:
urllib.parse.urlencode(values)
以上紅色框框,就是最重要的3點,做好了,就可以正常調用這個接口。最終獲取業務數據。
總結
以上就是針對body數據中是字典,字典中不僅僅是字符串,還有values是xml數據,並且需要轉碼,業務數據比較多的報文來處理的方法。另外,需要學習測試開發技術方面,或對測試自動化感興趣的,又喜歡聊天的,可以進群交流。
附言
url="http://127.0.0.1/api/test" headers = {'Content-Type':'application/json'} auth_data = { "jsonrpc":"2.0", "method":"user.login", "id":0 } urllib.parse.urlencode() 不能對string編碼,只能對dict類型編碼 urllib.parse.urlencode() #將dict類型參數轉化為query_string格式(key=value&key=value),並且將中文轉碼,最終會轉換為bytes(字節流)類型,如下: query_string = urllib.parse.urlencode(auth_data).encode('utf8') query_string為bytes類型,格式如:b'jsonrpc=2.0&method=user.login&id=0' #如果服務器端要求傳遞json格式數據,則先用json.dumps() 將dict參數先轉換為str,然后再使用bytes()將其轉換為bytes(字節流)類型,如下: #json.loads() transform str to dict;json.dumps() transform dict to str query_string = bytes(json.dumps(auth_data),'utf8') query_string為bytes類型,格式如:b'{"jsonrpc": "2.0", "method": "user.login"} #urllib.request.Request()要求傳遞的data為bytes(字節流)類型 request = urllib.request.Request(url,query_string,headers=headers) reponse = urllib.request.urlopen(request).read() content = json.loads(reponse.decode('utf8')) print(content)