如何在Python中編寫(xiě)接口和請(qǐng)求外部接口
一、引入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ō)明:本文編寫(xiě)的接口用到的是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)編寫(xiě)請(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的地址的話,直接這樣寫(xiě)的話會(huì)報(bào)SSLError: HTTPSConnectionPool
的問(wèn)題。
解決的方法是:
?res = requests.post(url, data=data, verify=False)
將verify
參數(shù)設(shè)置為False
。也就是不檢查SSL證書(shū)。
接收方:
@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ì)象中。
到此這篇關(guān)于如何在Python中編寫(xiě)接口和請(qǐng)求外部接口的文章就介紹到這了,更多相關(guān)在Python中編寫(xiě)接口和請(qǐng)求外部接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?AutoViz庫(kù)一行代碼實(shí)現(xiàn)可視化數(shù)據(jù)集
這篇文章主要介紹了python?AutoViz庫(kù)一行代碼實(shí)現(xiàn)可視化數(shù)據(jù)集實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python @property原理解析和用法實(shí)例
這篇文章主要介紹了Python @property原理解析和用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02flask 實(shí)現(xiàn)token機(jī)制的示例代碼
這篇文章主要介紹了flask 實(shí)現(xiàn)token機(jī)制的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python Django 通用視圖和錯(cuò)誤視圖的使用代碼
這篇文章主要介紹了Python Django 通用視圖和錯(cuò)誤視圖的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04python使用箱型圖剔除異常值的實(shí)現(xiàn)方法
python中的箱線圖可用于分析數(shù)據(jù)中的異常值,下面這篇文章主要給大家介紹了關(guān)于python使用箱型圖剔除異常值的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Python3.6+Django2.0以上 xadmin站點(diǎn)的配置和使用教程圖解
django自帶的admin站點(diǎn)雖然功能強(qiáng)大,但是界面不是很好看。這篇文章主要介紹了Python3.6+Django2.0以上 xadmin站點(diǎn)的配置和使用 ,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06python基礎(chǔ)教程之簡(jiǎn)單入門(mén)說(shuō)明(變量和控制語(yǔ)言使用方法)
這篇文章主要介紹了開(kāi)始學(xué)習(xí)python的第一步需要知道的知識(shí)(變量和控制語(yǔ)言使用方法),需要的朋友可以參考下2014-03-03Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人
這篇文章主要介紹了Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人,下文圍繞利用Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人的相關(guān)資料展開(kāi)內(nèi)容,需要的小伙伴可以參考一下2022-02-02