需求背景:
有兩個接口A和B,A是長鏈接,請求方法是get,B是普通的post請求,B發起請求后數據C會先返回到長連接請求然后再返回到請求B。
設計思路:
整體思路:由于A和B的響應時間都比較長,先發請求B,然后發請求A,長連接請求流程:先new一個session對象,建立鏈接,然后不斷請求獲取長連接返回數據。
最終代碼實現:
def A(environment,cf,token):
print("開始建立長連接......")
url = "https://" + cf["host"][environment] + cf["path"]["directives"]
print("url:",url)
headers = {
'Authorization': "Bearer "+ str(token),
'Device-Id': "test_device_222",
'Content-Type': "Bearer "+ str(token),
'User-Agent': "PostmanRuntime/7.15.2",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "10731c98-e876-49e0-9b69-543b55a47be0,6a238e6a-6d64-4dce-874b-58049dbc50a5",
'Host': cf["host"][environment],
'Accept-Encoding': "gzip, deflate",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
client = requests.session() #返回的是session()對象
while True:
print("===================【%sA開始請求】==================" % time.asctime(time.localtime(time.time())))
#建一個長連接
r = client.get(url,headers=headers,verify=False,stream=True)
delimiter = "--------test_device_222".encode("utf-8")
for line in r.iter_lines(delimiter=delimiter):
if line:
decoded_line = line.decode('utf-8')
print(decoded_line)
#發起post請求,接口B
def B(url,cf,token,environment,metadata_json ):
pcmfile = cf["path"]["pcmfile"]
headers = {
'Device-Id': 'test_device_222',
'Authorization': 'Bearer ' + token,
}
metadata_json['event']['header']['messageId'] = "test-" + str(uuid.uuid4())
body = json.dumps(metadata_json)
#打開本地pcm文件,讀取數據,寫入body中
pcm_file = {'metadata': body,'audio': (pcmfile, open(pcmfile, 'rb').read(), 'application/octet-stream')}
print("================【B 請求開始時間:%s】=================="%time.asctime( time.localtime(time.time())))
response = requests.post(url, files=pcm_file, headers=headers,verify=False)
#如果請求報錯401,說明token過期,重新獲取發起請求
if response.status_code==401:
multipart_data = B(url,cf,token,environment)
else:
multipart_data = decoder.MultipartDecoder.from_response(response)
print("================【B 請求結束時間:%s】=================="%time.asctime( time.localtime(time.time())))
說明點:
a. 獲取長連接返回數據時,發起get請求必須要加的參數是“stream”,由于我測試的請求是https請求,需要在方法中加上參數“verify=False”,關閉ssl證書校驗。
b. 很多模塊沒導入,pycharm會彈出提示的,裝上就可以了
c. cf 是我自己定義的字典變量,用來寫配置,因為配置比較少,我暫時寫在了代碼中
主要想說明長連接請求的發送,其他的就不詳細贅述了
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。