日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

如何在Python中編寫接口和請求外部接口_python

作者:碼農(nóng)飛哥 ? 更新時間: 2022-04-12 編程語言

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

代碼解釋:

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

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

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

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

欄目分類
最近更新