當(dāng)業(yè)務(wù)處理比較耗時時, 接口一般會采用異步處理的方式, 這種異步處理的方式又叫Future模式.
一般流程
當(dāng)你請求一個異步接口,接口會立刻返回你一個結(jié)果告訴你已經(jīng)開始處理,結(jié)果中一般會包含一個任務(wù)id類似的東西用于追蹤結(jié)果, 另外會提供一個查詢結(jié)果的接口, 當(dāng)結(jié)果未處理完查詢接口會返回相應(yīng)的"未完成"狀態(tài), 如果已經(jīng)處理完,則會返回相應(yīng)的數(shù)據(jù).
處理方法
異步接口我們一般采取輪詢的方法,每隔一定時間間隔取請求一下查詢結(jié)果的接口,直到接口返回的狀態(tài)是已完成/查詢到指定數(shù)據(jù)或超時
如果異步接口沒有提供追蹤id和查詢接口,我們可以通過同樣的方法輪詢查取數(shù)據(jù)庫數(shù)據(jù)或日志數(shù)據(jù)直到獲取到指定結(jié)果或超時
示例接口
- 創(chuàng)建訂單接口
請求地址
http://115.28.108.130:5000/api/order/create/
請求方法
GET/POST
請求格式
POST: 表單
參數(shù) | 類型 | 說明 |
---|---|---|
user_id | String | 用戶id |
goods_id | String | 商品id |
num | int | 數(shù)量 |
amount | float | 總價 |
響應(yīng)示例
缺少參數(shù):
{
"msg": "參數(shù)缺失"
}
成功:
{
"order_id": "69561"
}
- 獲取訂單結(jié)果接口
請求地址
http://115.28.108.130:5000/api/order/get_result/?order_id=***
請求方法
GET
參數(shù) | 類型 | 說明 |
---|---|---|
order_id | String | 訂單id |
響應(yīng)示例
創(chuàng)建中:
{}
創(chuàng)建成功:
{
"amount": "20.0",
"goods_id": "123",
"num": "2",
"user_id": "123"
}
Python實現(xiàn)方法
import time
import requests
def create_order():
url = "http://115.28.108.130:5000/api/order/create/" # 異步接口
data = {
"user_id": "1234",
"goods_id": "136",
"num": 10,
"amount": 20.00
}
res = requests.post(url=url, data=data)
return res.json().get("order_id") # 返回order_id用于追蹤
def get_order_result(interval = 1, time_out = 60): # 設(shè)置了默認(rèn)時間間隔和超時時間,可以修改
order_id = create_order()
# 查詢結(jié)果接口
url = "http://115.28.108.130:5000/api/order/get_result/?order_id={}".format(order_id)
start_time = time.time() # 啟動時間
end_time = start_time + time_out 啟動時間+超時時間=結(jié)束時間
count = 1 # 計數(shù)器, 此處是為了顯示更直觀, 可以去掉
while time.time() < end_time: # 當(dāng)未到結(jié)束時間時, 循環(huán)請求
res = requests.get(url) # 請求查詢結(jié)果接口
print(count, res.json())
count += 1
time.sleep(interval) # 休眠指定時間
if res.json(): # 如果有數(shù)據(jù)則退出循環(huán)
break
else:
return None # 正常退出(達(dá)到end_time, 非break退出) 返回None
return res.json() # break退出返回 接口數(shù)據(jù)
if __name__ == '__main__':
order_result = get_order_result()
print(order_result)
更多學(xué)習(xí)資料請加添加作者微信:lockingfree獲取