Python接口測試之urllib.parse.urlencode


  引言

  今天將的接口測試中常見的一種請求數據類型,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 有這些庫名可用: urlliburllib2, 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中也有urlliburllib3兩個庫,其中urllib幾乎是Python2urlliburllib2兩個模塊的集合,所以我們最常用的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)

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM