欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何在Python中編寫(xiě)接口和請(qǐng)求外部接口

 更新時(shí)間:2022年02月08日 09:48:12   作者:碼農(nóng)飛哥  
這篇文章主要介紹了如何在Python中編寫(xiě)接口和請(qǐng)求外部接口,requests庫(kù)來(lái)請(qǐng)求外部接口,按照請(qǐng)求方法分為get請(qǐng)求和post請(qǐng)求,下面和小編一起進(jìn)入文章了解更多的具體內(nèi)容吧

一、引入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']

代碼解釋:

  1. res = requests.get(url) 就是發(fā)起Get請(qǐng)求,獲取響應(yīng)值。
  2. content = res.content.decode('utf-8')因?yàn)?code>res.content默認(rèn)的類型是bytes類型的,所以需要進(jìn)行解碼轉(zhuǎn)成str類型。只有轉(zhuǎn)化之后才能被正確的反序列化。
  3. tokenJson = json.loads(content) 就是將Json字符串反序列了成字典,這個(gè)對(duì)象是一個(gè)dict,

pythonjson的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系如下圖所示:

4.access_token = tokenJson['access_token']獲取keyaccess_tokentoken值。

三、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-urlencodedapplication/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ù)集

    這篇文章主要介紹了python?AutoViz庫(kù)一行代碼實(shí)現(xiàn)可視化數(shù)據(jù)集實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python @property原理解析和用法實(shí)例

    Python @property原理解析和用法實(shí)例

    這篇文章主要介紹了Python @property原理解析和用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python 多核并行計(jì)算的示例代碼

    Python 多核并行計(jì)算的示例代碼

    本篇文章主要介紹了Python 多核并行計(jì)算的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • flask 實(shí)現(xiàn)token機(jī)制的示例代碼

    flask 實(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-11
  • Python Django 通用視圖和錯(cuò)誤視圖的使用代碼

    Python Django 通用視圖和錯(cuò)誤視圖的使用代碼

    這篇文章主要介紹了Python Django 通用視圖和錯(cuò)誤視圖的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • python使用箱型圖剔除異常值的實(shí)現(xiàn)方法

    python使用箱型圖剔除異常值的實(shí)現(xiàn)方法

    python中的箱線圖可用于分析數(shù)據(jù)中的異常值,下面這篇文章主要給大家介紹了關(guān)于python使用箱型圖剔除異常值的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • python日志模塊loguru詳解

    python日志模塊loguru詳解

    大家好,本篇文章主要講的是python日志模塊loguru詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Python3.6+Django2.0以上 xadmin站點(diǎn)的配置和使用教程圖解

    Python3.6+Django2.0以上 xadmin站點(diǎn)的配置和使用教程圖解

    django自帶的admin站點(diǎn)雖然功能強(qiáng)大,但是界面不是很好看。這篇文章主要介紹了Python3.6+Django2.0以上 xadmin站點(diǎn)的配置和使用 ,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • python基礎(chǔ)教程之簡(jiǎn)單入門(mén)說(shuō)明(變量和控制語(yǔ)言使用方法)

    python基礎(chǔ)教程之簡(jiǎn)單入門(mén)說(shuō)明(變量和控制語(yǔ)言使用方法)

    這篇文章主要介紹了開(kāi)始學(xué)習(xí)python的第一步需要知道的知識(shí)(變量和控制語(yǔ)言使用方法),需要的朋友可以參考下
    2014-03-03
  • Python?實(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ī)器人,下文圍繞利用Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人的相關(guān)資料展開(kāi)內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論