網(wǎng)站首頁 編程語言 正文
一、引入requests庫
Python是通過requests
庫來請求接口的,所以,首先需要通過pip安裝requests庫。
pip install requests==2.21.0 #文件上傳才會用 pip install requests-toolbelt==0.9.1
說明:本文編寫的接口用到的是Flask框架關(guān)于Flask框架的使用請參考
二、Get請求
這里以微信授權(quán)的接口為例。
接口文檔如下:
這是一個通過Get
方式請求的接口,返回類型是application/json
,
所以請求的代碼是:
# 引入庫 import requests,json ? ? url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=123&secret=345" ?? ?# 請求接口 ?? ? res = requests.get(url) ?? ? #對返回的內(nèi)容進(jìn)行編碼 ?? ?content = res.content.decode('utf-8') ?? ?#將json字符串反序列化 ?? ?tokenJson = json.loads(content) ?? ?access_token = tokenJson['access_token']
代碼解釋:
-
res = requests.get(url)
就是發(fā)起Get請求,獲取響應(yīng)值。 -
content = res.content.decode('utf-8')
因為res.content
默認(rèn)的類型是bytes類型的,所以需要進(jìn)行解碼轉(zhuǎn)成str類型。只有轉(zhuǎn)化之后才能被正確的反序列化。 -
tokenJson = json.loads(content)
就是將Json字符串反序列了成字典,這個對象是一個dict,
python
與json
的數(shù)據(jù)類型對應(yīng)關(guān)系如下圖所示:
4.access_token = tokenJson['access_token']
獲取key
為access_token
的token
值。
三、Post請求
Post
請求方法同樣是一個非常常用的請求方法。
Post請求的請求類型有三種:
-
application/x-www-form-urlencoded
這是以form表單的方式來提交post請求。 -
application/json;charset=utf-8
這是以json字符串的格式,將請求參數(shù)放在RequestBody
中的方式。 -
form-data
這種方式一般是用來上傳文件用的。
下面分別就這三種請求方式來編寫請求代碼
1.以form表單提交的方式
請求方:
def post_form_urlencoded(): ? ? url = "http://127.0.0.1:8080/v1/ls/voice/save" ? ? data = {"dst_audio": "9d62ca66-326f-4070-9993-5f89f790dc68.wav"} ? ? res = requests.post(url, data) ? ? content = res.content.decode('utf-8') ? ? print(content)
以form
表單提交的post請求,只需要把請求參數(shù)封裝到一個字典dict中進(jìn)行傳入就可以了。這里傳入了一個名為dst_audio的參數(shù)。不需要設(shè)置Content-Type
。
如果我們的請求的接口的域名是https的地址的話,直接這樣寫的話會報SSLError: HTTPSConnectionPool
的問題。
解決的方法是:
?res = requests.post(url, data=data, verify=False)
將verify
參數(shù)設(shè)置為False
。也就是不檢查SSL證書。
接收方:
@ma.route('/v1/ls/voice/save', methods=['POST']) def save(): ? ? group_uuid = uuid.uuid1() ?? ?dst_audio = request.values.get('dst_audio') ? ?? ?my_data = { ?? ??? ?"video_id": group_uuid ?? ?} ?? ?return jsonify({'code': 0, 'msg': "保存成功", 'data': json_data})
接收Form
表單中的參數(shù)只需要通過request.values.get
(參數(shù)名) 來獲取。多個參數(shù)分別獲取。route
里定義了接口的路由地址,methods屬性指定接口的請求方法。其中jsonify
函數(shù)是將dict
序列化成json
字符串,是flask框架的一個函數(shù)。
2.以json字符串的格式來提交
請求方:
def post_json(): ? ? url = "http://127.0.0.1:8080/v1/ls/json" ? ? x_header = { ? ? ? ? 'Content-Type': 'application/json; charset=utf-8', ? ? } ? ? body = json.dumps({"name": "張三", "age": 12}) ? ? res = requests.post(url, data=body, headers=x_header, timeout=10) ? ? content = res.content.decode('utf-8') ? ? print(content)
application/json
請求類型的接口,需要將請求參數(shù)通過json.dumps
方法序列化成一個Json字符串傳入給接口,然后,在請求頭中指定Content-Type為application/json; charset=utf-8
。
調(diào)用post方法requests.post(url, data=body, headers=x_header)
。其中:data 指定請求參數(shù),headers
指定請求頭。timeout 是指定超時時間是10秒
接收方:
@ma.route('/v1/ls/json', methods=['POST']) def post_json(): ? ? if request.method == 'POST': ? ? ? ? json_data_str = request.get_data().decode('utf-8') ? ? ? ? json_data = json.loads(json_data_str) ? ? ? ? return jsonify({'code': 0, 'msg': "請求成功", 'data': json_data})
接收請求體中參數(shù)只需要調(diào)用request.get_data().decode('utf-8')方法,這里必須要將其解碼,不然,中文會被編碼{"name": "\\u5f20\\u4e09", "age": 12}。
3.文件上傳
請求方:
from requests_toolbelt.multipart.encoder import MultipartEncoder def post_form_data(): ? ? post_url = "http://127.0.0.1:8080/v1/ls/upload" ? ? headers = {} ? ? multipart_encoder = MultipartEncoder( ? ? ? ? fields={ ? ? ? ? ? ? ?'file': (os.path.basename('D:\\test.txt'), open('D:\\test.txt', 'rb'), 'application/octet-stream'), ? ? ? ? ? ? 'file_name': '張三' ? ? ? ? } ? ? ) ? ? headers['Content-Type'] = multipart_encoder.content_type ? ? post_response = requests.post(post_url, data=multipart_encoder, headers=headers, verify=False) ? ? content = post_response.content.decode('utf-8') ? ? print(content)
form-data
請求類型的接口,一般是文件上傳的接口,我們可以將參數(shù)封裝到MultipartEncoder
對象中,在fields中定義一個字典,在這個字典中傳入多個參數(shù)。其中 file 參數(shù)指定需要上傳的文件,通過open('D:\\test.txt', 'rb')方法讀取文件的內(nèi)容。并指定請求類型為application/octet-stream
。file是參數(shù)名稱,需要按照接口方的定義傳入。
接收方:
@ma.route('/v1/ls/upload', methods=['POST']) def post_form_data(): ? ? temp_file = request.files['file'] ? ? file_name = request.values.get('file_name') ? ? file_path = os.path.abspath('.') + "/" + "temp.txt" ? ? temp_file.save(file_path) ? ? return jsonify({'code': 0, 'msg': "請求成功", 'data': file_path})
文件上傳的接口接收文件是通過request.files['file']
方式來接收的。
三個接口的請求結(jié)果如下圖:
四、總結(jié)
本文詳細(xì)介紹了Python中通過requests庫來請求外部接口,按照請求方法分為get請求和post請求。post請求的按照請求類型又分為application/x-www-form-urlencoded
,application/json以及form-data
這三種。這三種的請求大同小異,只是傳參不同而已,當(dāng)請求類型是application/x-www-form-urlencoded
時請求參數(shù)封裝到dict中傳入,當(dāng)請求類型是application/json
時傳入的請求參數(shù)需要時一個json字符串。當(dāng)請求類型是form-data時,可以將請求參數(shù)封裝到MultipartEncoder對象中。
原文鏈接:https://blog.csdn.net/u014534808/article/details/113665128
相關(guān)推薦
- 2022-07-02 C++中關(guān)于互斥量的全面認(rèn)知_C 語言
- 2022-10-17 在?C#?中使用?Span<T>?和?Memory<T>?編寫高性能代碼的詳
- 2022-07-28 詳解Python中4種超參自動優(yōu)化算法的實現(xiàn)_python
- 2022-11-08 goalng?結(jié)構(gòu)體?方法集?接口實例詳解_Golang
- 2022-03-22 .NET?6開發(fā)TodoList開發(fā)查詢分頁_實用技巧
- 2022-06-09 忘記Grafana不要緊2種Grafana重置admin密碼方法詳細(xì)步驟_服務(wù)器其它
- 2022-04-09 Python中緩存lru_cache的基本介紹和講解_python
- 2023-04-12 C#?DataGridView行列轉(zhuǎn)換的具體實現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支