Request使用方法快速介紹
Request是第三方庫,需要手動(dòng)安裝:
pip install requests
需要導(dǎo)入requests模塊
import requests
Requests中文文檔:http://docs.python-requests.org/zh_CN/latest/
這個(gè)文檔看的話從哪看起呢匿情,大家要有技巧兰迫,下面有目錄(用戶指南)這個(gè)地方,安裝完成的話炬称,這里有個(gè)快速上手汁果。
大家如果以后看文檔,有什么快速上手玲躯,通尘莸拢可以先看它鳄乏,像這種章節(jié)都是讓你快速的了解下這個(gè)庫的一些功能。常用的方法都卸載快速上手里面棘利,怎么發(fā)送請(qǐng)求橱野、傳遞URL參數(shù)、響應(yīng)內(nèi)容善玫、定制請(qǐng)求頭等等水援,下面介紹下怎么使用requests
庫構(gòu)建請(qǐng)求,接收響應(yīng)
構(gòu)建各種http請(qǐng)求
- http.get請(qǐng)求
requests.get('https://api.github.com/events')
比如列出課程的請(qǐng)求代碼
import requests
host = 'localhost'
requests.get(f'http://{host}/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20 ')
我們打開抓包工具Fiddler茅郎,然后運(yùn)行代碼蜗元,包就被Fiddler抓到了
我們用python代碼一樣可以發(fā)請(qǐng)求。
- http.post請(qǐng)求
requests.post('http://httpbin.org/post', data = {'key':'value'})
- http.put請(qǐng)求
requests.put('http://httpbin.org/put', data = {'key':'value'})
- http.delete請(qǐng)求
requests.delete('http://httpbin.org/delete')
構(gòu)建URL參數(shù)
有一點(diǎn)我們要注意的是URL參數(shù)系冗,我們可以直接這樣奕扣。
直接寫在里面沒有關(guān)系。如果你覺得這種寫法不是很清晰的話掌敬,你可以參照這種寫法:
語法
payload = {'key1': 'value1', 'key2': 'value2'}
requests.get("http://httpbin.org/get", params=payload)
params參數(shù)接收的是一個(gè)字典惯豆,把URL參數(shù)去掉,把他定義在一個(gè)字典一樣的數(shù)據(jù)結(jié)構(gòu)里面奔害。
比如說
import requests
host = 'localhost'
p1 = {
'action':'list_course',
'pagenum':'1',
'pagesize':'20'
}
requests.get(f'http://{host}/api/mgr/sq_mgr/',params=p1)
這樣就可以了楷兽。
構(gòu)建請(qǐng)求頭
如果你想為請(qǐng)求添加 HTTP 頭部,只要簡單地傳遞一個(gè) dict (字典)給 headers 參數(shù)就可以了舀武。
例如拄养,在前一個(gè)示例中我們沒有指定 content-type:
>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.get(url, headers=headers)
假如說我們上面的請(qǐng)求還要有請(qǐng)求頭的話,就是在底下再添加一個(gè)headers
參數(shù)
然后里面填上你所要帶進(jìn)去的請(qǐng)求頭所對(duì)應(yīng)的字典银舱,比如例子里面就多了個(gè)user-agent
值是my-app/0.0.1
瘪匿。
假如我想消息體頭里面帶上這兩個(gè)參數(shù)'username':quanlei
和'password':111111
這兩個(gè)參數(shù),要怎么帶上去寻馏?就根據(jù)例子寫吧棋弥,就像這樣子
import requests
host = 'localhost'
p1 = {
'action':'list_course',
'pagenum':'1',
'pagesize':'20'
}
h1 = {
'username':'quanlei',
'password':'111111'
}
requests.get(f'http://{host}/api/mgr/sq_mgr/',params=p1,headers=h1)
我們發(fā)送看一下請(qǐng)求消息是否帶上這個(gè)消息頭了。
是不是就可以了诚欠,是不是很方便顽染。
定制請(qǐng)求體
請(qǐng)求體類型:Content-Type: application/x-www-form-urlencoded
只需簡單地傳遞一個(gè)字典給 data 參數(shù)
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
我們以添加課程為例,因?yàn)樗彩?code>Content-Type: application/x-www-form-urlencoded(表單格式)
我們先看去以前的文章看下添加課程的接口文檔:http://www.reibang.com/p/b7125f62dd52
大家注意一下data
這個(gè)參數(shù)值
data 必填 存儲(chǔ)創(chuàng)建課程的信息轰绵,包括名稱粉寞、描述、顯示次序左腔。
為json格式唧垦。例如:{"name":"初中化學(xué)", "desc":"初中化學(xué)課程","display_idx":"4"
}
大家會(huì)說{"name":"初中化學(xué)", "desc":"初中化學(xué)課程","display_idx":"4" }
這不是json嗎?json其實(shí)就是一個(gè)json格式的字符串液样。大家注意這里只是符合json格式的字符串振亮。直接把內(nèi)容傳進(jìn)去就行巧还。
代碼:
import requests
host = 'localhost'
h1 = {
'username':'quanlei',
'password':'111111'
}
payload = {
'action':'add_course',
'data':'''
{
"name":"萬圣節(jié)",
"desc":"初中化學(xué)課程",
"display_idx":"4"
}'''
}
requests.post(f'http://{host}/api/mgr/sq_mgr/',headers=h1,data=payload)
抓包看一下,請(qǐng)求成功了
這里我們可以看到抓包的內(nèi)容POST
請(qǐng)求坊秸,url是http://localhost/api/mgr/sq_mgr/
這個(gè)麸祷,這里我們并沒有指定消息頭是www-form-urlencoded
,但是只要你有data
參數(shù)傳入了一個(gè)字典褒搔,他就認(rèn)為你消息體是www-form-urlencoded
格式阶牍。大家看下消息體
這就是www-form-urlencoded
格式中間用&
隔開,這里面的內(nèi)容因?yàn)橐呀?jīng)做了編碼站超,如果想看里面的內(nèi)容荸恕,點(diǎn)一下WebForms
因?yàn)槟闶莊orm格式,他就會(huì)變成這種容易看的格式死相。
如果有請(qǐng)求的消息不是www-form-urlencoded
,比如是Json
格式呢咬像,比如我們這里有個(gè)Json
格式添加課程的接口如下
請(qǐng)求語法
POST /apijson/mgr/sq_mgr/ HTTP/1.1
Content-Type: application/json
url請(qǐng)求參數(shù)
無url請(qǐng)求參數(shù)
請(qǐng)求體內(nèi)容
{
"action" : "add_course_json",
"data" : {
"name":"初中化學(xué)",
"desc":"初中化學(xué)課程",
"display_idx":"4"
}
}
響應(yīng)語法
HTTP/1.1 200 OK
Content-Type: application/json
頭部信息
Content-Type 必填 正常情況下該值將被設(shè)為application/json算撮,表示返回 JSON 格式的文本信息。
響應(yīng)內(nèi)容
如果請(qǐng)求成功县昂,返回json格式的消息體肮柜,如下所示,retcode值為0表示添加成功
{
"retcode": 0
}
說明
增加課程的名稱如果已經(jīng)存在倒彰,則會(huì)創(chuàng)建失敗返回結(jié)果為
{
"retcode": 2,
"reason": "同名課程已經(jīng)存在"
}
請(qǐng)求體類型:Content-Type: application/json
可以將字典直接傳遞給json參數(shù)
payload2={
"action" : "add_course_json",
"data" : {
"name":"初中化學(xué)",
"desc":"初中化學(xué)課程",
"display_idx":"4"
}
}
resp=requests.post("http://localhost/apijson/mgr/sq_mgr/", json=payload2)