網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、引入requests庫(kù)
Python是通過(guò)requests
庫(kù)來(lái)請(qǐng)求接口的,所以,首先需要通過(guò)pip安裝requests庫(kù)。
pip install requests==2.21.0 #文件上傳才會(huì)用 pip install requests-toolbelt==0.9.1
說(shuō)明:本文編寫的接口用到的是Flask框架關(guān)于Flask框架的使用請(qǐng)參考
二、Get請(qǐng)求
這里以微信授權(quán)的接口為例。
接口文檔如下:
這是一個(gè)通過(guò)Get
方式請(qǐng)求的接口,返回類型是application/json
,
所以請(qǐng)求的代碼是:
# 引入庫(kù) import requests,json ? ? url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=123&secret=345" ?? ?# 請(qǐng)求接口 ?? ? res = requests.get(url) ?? ? #對(duì)返回的內(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請(qǐng)求,獲取響應(yīng)值。 -
content = res.content.decode('utf-8')
因?yàn)?code>res.content默認(rèn)的類型是bytes類型的,所以需要進(jìn)行解碼轉(zhuǎn)成str類型。只有轉(zhuǎn)化之后才能被正確的反序列化。 -
tokenJson = json.loads(content)
就是將Json字符串反序列了成字典,這個(gè)對(duì)象是一個(gè)dict,
python
與json
的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系如下圖所示:
4.access_token = tokenJson['access_token']
獲取key
為access_token
的token
值。
三、Post請(qǐng)求
Post
請(qǐng)求方法同樣是一個(gè)非常常用的請(qǐng)求方法。
Post請(qǐng)求的請(qǐng)求類型有三種:
-
application/x-www-form-urlencoded
這是以form表單的方式來(lái)提交post請(qǐng)求。 -
application/json;charset=utf-8
這是以json字符串的格式,將請(qǐng)求參數(shù)放在RequestBody
中的方式。 -
form-data
這種方式一般是用來(lái)上傳文件用的。
下面分別就這三種請(qǐng)求方式來(lái)編寫請(qǐng)求代碼
1.以form表單提交的方式
請(qǐng)求方:
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請(qǐng)求,只需要把請(qǐng)求參數(shù)封裝到一個(gè)字典dict中進(jìn)行傳入就可以了。這里傳入了一個(gè)名為dst_audio的參數(shù)。不需要設(shè)置Content-Type
。
如果我們的請(qǐng)求的接口的域名是https的地址的話,直接這樣寫的話會(huì)報(bào)SSLError: HTTPSConnectionPool
的問(wèn)題。
解決的方法是:
?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ù)只需要通過(guò)request.values.get
(參數(shù)名) 來(lái)獲取。多個(gè)參數(shù)分別獲取。route
里定義了接口的路由地址,methods屬性指定接口的請(qǐng)求方法。其中jsonify
函數(shù)是將dict
序列化成json
字符串,是flask框架的一個(gè)函數(shù)。
2.以json字符串的格式來(lái)提交
請(qǐng)求方:
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
請(qǐng)求類型的接口,需要將請(qǐng)求參數(shù)通過(guò)json.dumps
方法序列化成一個(gè)Json字符串傳入給接口,然后,在請(qǐng)求頭中指定Content-Type為application/json; charset=utf-8
。
調(diào)用post方法requests.post(url, data=body, headers=x_header)
。其中:data 指定請(qǐng)求參數(shù),headers
指定請(qǐng)求頭。timeout 是指定超時(shí)時(shí)間是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': "請(qǐng)求成功", 'data': json_data})
接收請(qǐng)求體中參數(shù)只需要調(diào)用request.get_data().decode('utf-8')方法,這里必須要將其解碼,不然,中文會(huì)被編碼{"name": "\\u5f20\\u4e09", "age": 12}。
3.文件上傳
請(qǐng)求方:
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
請(qǐng)求類型的接口,一般是文件上傳的接口,我們可以將參數(shù)封裝到MultipartEncoder
對(duì)象中,在fields中定義一個(gè)字典,在這個(gè)字典中傳入多個(gè)參數(shù)。其中 file 參數(shù)指定需要上傳的文件,通過(guò)open('D:\\test.txt', 'rb')方法讀取文件的內(nèi)容。并指定請(qǐng)求類型為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': "請(qǐng)求成功", 'data': file_path})
文件上傳的接口接收文件是通過(guò)request.files['file']
方式來(lái)接收的。
三個(gè)接口的請(qǐng)求結(jié)果如下圖:
四、總結(jié)
本文詳細(xì)介紹了Python中通過(guò)requests庫(kù)來(lái)請(qǐng)求外部接口,按照請(qǐng)求方法分為get請(qǐng)求和post請(qǐng)求。post請(qǐng)求的按照請(qǐng)求類型又分為application/x-www-form-urlencoded
,application/json以及form-data
這三種。這三種的請(qǐng)求大同小異,只是傳參不同而已,當(dāng)請(qǐng)求類型是application/x-www-form-urlencoded
時(shí)請(qǐng)求參數(shù)封裝到dict中傳入,當(dāng)請(qǐng)求類型是application/json
時(shí)傳入的請(qǐng)求參數(shù)需要時(shí)一個(gè)json字符串。當(dāng)請(qǐng)求類型是form-data時(shí),可以將請(qǐng)求參數(shù)封裝到MultipartEncoder對(duì)象中。
原文鏈接:https://blog.csdn.net/u014534808/article/details/113665128
相關(guān)推薦
- 2022-08-10 C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法_C 語(yǔ)言
- 2022-10-06 Python中os模塊的12種用法總結(jié)_python
- 2022-08-06 C語(yǔ)言實(shí)現(xiàn)UDP通信_(tái)C 語(yǔ)言
- 2022-05-20 ElasticSearch 7.X系列之: 檢索性能優(yōu)化實(shí)戰(zhàn)指南
- 2022-09-08 Go語(yǔ)言中的Iota關(guān)鍵字_Golang
- 2022-03-08 android?studio組件通信:Intend啟動(dòng)Activity接收返回結(jié)果_Android
- 2023-02-14 C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)_C 語(yǔ)言
- 2022-09-05 Spring 解決循環(huán)依賴
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支