requests庫傳送請求、封裝、資料的管理
一,以multipart形式傳送post請求,只要將requests.post()的files引數即可
import requests,json
url = "http://httpbin.org/post"#一個測試網站的地址
files = {"file":open("test.txt","rb")}#在相對路徑下找到test.txt的檔案,給到files變數
re = requests.post(url,files=files)
print(re.text)
print (re.status_code)
返回資料,注意files中的資料,就是TXT文字中寫入的內容,content型別是multipart/form-data
{
"args": {},
"data": "",
"files": {
"file": "Hello Python!!!!"
},
"form": {},
"headers": {
"Accept": "*/*" ,
"Accept-Encoding": "gzip, deflate",
"Content-Length": "160",
"Content-Type": "multipart/form-data; boundary=a93c21e8ba7c134b0a78a6bdc992e75b",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0" ,
"X-Amzn-Trace-Id": "Root=1-6018ec93-3376f0bf44a62fca34ac5163"
},
"json": null,
"origin": "202.127.0.116",
"url": "http://httpbin.org/post"
}
200
二,以json形式傳送請求
import requests,json
url = "http://httpbin.org/post"#一個測試網站的地址
data={"key1":"value1",
"key2":"value2",
"key3":"value3"}
#用json裡面的dumps方法將data資料轉換成json資料
json_data = json.dumps(data)
re = requests.post(url,json_data)
print(re.text)
print(re.status_code)
返回值如下,json裡有資料,jsons資料,這個為啥不顯示content-type?
{
"args": {},
"data": "{\"key1\": \"value1\", \"key2\": \"value2\", \"key3\": \"value3\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "54",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-6018ee99-6d0939483ed19072080f386d"
},
"json": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"origin": "202.127.0.116",
"url": "http://httpbin.org/post"
}
200
三,是最常用的方式,表單形式
import requests,json
url = "http://httpbin.org/post"#一個測試網站的地址
data={"key1":"value1",
"key2":"value2",
"key3":"value3"}
#這裡直接將資料傳入到請求裡面
re = requests.post(url,data)
print(re.text)
print(re.status_code)
輸出如下的內容:“Content-Type”: “application/x-www-form-urlencoded”,
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "35",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-6018f024-20df1180409fad4a7aebe307"
},
"json": null,
"origin": "202.127.0.116",
"url": "http://httpbin.org/post"
}
200
四,將上面的程式碼封裝一下
1,
`import requests
#新建一個檔案,命名為keyword_demo,將一些方法封裝,等著其他檔案呼叫
class KeyDemo:
#新建一個類 ,下面包含get請求個post請求
def get(self,url,header=None,params=None):
return requests.get(url=url,headers=header,params=params)
#傳入引數,url外預設為none
def post(self,url,header=None,params=None):
return requests.post(url=url,headers=header,params=params)
2,在一個名為demo的檔案中呼叫剛才封裝的類
#匯入剛才封裝的方法,from檔名import類名
from keyword_demo import KeyDemo
#例項化一個物件,可以拿著個物件去呼叫keyword_demo裡面的方法get和post
kd = KeyDemo()
url = "http://httpbin.org/post"#一個測試網站的地址
data={"key1":"value1",
"key2":"value2",
"key3":"value3"}
#這裡拿著例項化物件kd呼叫類KeyDemo的方法
re = kd.post(url=url,params=data)
print(re.text)
print(re.status_code)
返回資料跟之前直接使用requests庫一樣的資料
{
"args": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-601900ed-4ce72146554fd82b71e664c9"
},
"json": null,
"origin": "202.127.0.116",
"url": "http://httpbin.org/post?key1=value1&key2=value2&key3=value3"
}
200
3,剛才執行了類的封裝和呼叫,現在要將資料也封裝進去。在同級目錄下新建一個檔案,命名為config.ini,內容為:
[DEFAULT]
url = http://httpbin.org/post
將此連結作為檔案匯入
4,呼叫剛才新建的ini檔案,注意read後面的路徑,同級目錄下就不用加上’…/’,如果是不同目錄,需要加上點點槓。
from keyword_demo import KeyDemo
#匯入這個庫
import configparser
#生成一個物件
conf = configparser.ConfigParser()
#用這個物件去讀檔案裡面的資訊
conf.read("config.ini")
#這句程式碼直接將連結打印出來,就是ini檔案中的url
print(conf.get("DEFAULT","url"))
4,到這一步,將URL也封裝了,現在將測試資料也封裝一下,就是
data={“key1”:“value1”,
“key2”:“value2”,
“key3”:“value3”}
咋封裝呢,新建一個檔案,叫login.yaml,建立以下資料,不弄太多組資料,容易亂
data:
key1:111111111111,
(插入一下,這個yaml檔案裡的data不能有逗號,像這樣也是可以的:
data:
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222
key1:111111111111
key2:222222222222)
資料建立好了,我們要拿到這個資料,
from keyword_demo import KeyDemo
#匯入yaml包
import yaml
#生成一個檔案物件
file = open("login.yaml","r")
#用下面的命令將檔案開啟
data = yaml.load(file,yaml.FullLoader)
#輸出一個字典:{'data': 'key1:111111111111'}
print(data)
5,現在為止,就已經把所有的資料封裝完畢,彙總到demo檔案裡
#匯入自己封裝的類
from keyword_demo import KeyDemo
#匯入類為了獲得ini檔案中的url,以後可以用的url的地方都可以呼叫這個
import configparser
#匯入yaml為了獲得data資料
import yaml
#生成一個例項物件
kd = KeyDemo()
#獲取到url
conf = configparser.ConfigParser()
conf.read("config.ini")
url = conf.get("DEFAULT","url")
#獲取到data
file = open("login.yaml","r")
data = yaml.load(file,yaml.FullLoader)
#建立一個請求物件
re = kd.post(url=url,params=data)
print(re.text)
print(re.status_code)
輸出:
{
"args": {
"data": "key1:111111111111"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-60190d82-066258f37eccc1b429184705"
},
"json": null,
"origin": "202.127.0.116",
"url": "http://httpbin.org/post?data=key1%3A111111111111"
}
200