程序员必知:同步接口和异步接口

简介: 程序员必知:同步接口和异步接口

1、定义

同步调用:当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用;

异步调用:同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用;

2、支付异步接口

当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。很多新手会拿这个结果当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。

同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。当天的支付到第二天还在被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般支付渠道侧,只有支付成功了才通知你。要是支付失败了,压根儿都不告诉你。 另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,反查,一般支付渠道侧都会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。

3、理解

简而言之,言而总之: 同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。

4、Python 模拟测试异步接口

# order 下单接口:

url = localhost:1234/order/create

method = post

body = {

"goodsId":"102030",

"userId":"6666",

"num":10,

"amount":100

}

response = {

"code":"0000",

"msg":"sucess",

"data":{

"order":"dcs123456789",

"locator":"/order/get_result/"

}//代码效果参考:http://www.ezhiqi.com/zx/art_608.html}//代码效果参考:http://www.ezhiqi.com/bx/art_6823.html

# getOrder 查询订单接口:

url = localhost:1234/order/get_result?orderId=dcs123456789

method = get

response = {

"code":"0000",

"msg":"sucess",

"data":{

"order":"dcs123456789",

"status": 1,

"desc": "下单成功",

"goodsId":"102030",

"userId":"6666",

"num":10,

"amount":100

}}

import time

import requests

def create_order():

url = "" # 异步接口

data = {

"goodsId":"102030",

"userId":"6666",

"num":10,

"amount":100

}//代码效果参考:http://www.ezhiqi.com/zx/art_66.html

res = requests.post(url=url, json=data)

return res.json().get("data").get("order") # 返回order_id用于追踪

def get_order_result(interval=1, time_out=10): # 设置了默认时间间隔和超时时间,可以修改

order_id = create_order()

# 查询结果接口

url = "".format("2423432")

start_time = time.time() # 启动时间

end_time = start_time + time_out #启动时间 + 超时时间 = 结束时间

count = 1 # 计数器, 此处是为了显示更直观, 可以去掉

while time.time() < end_time: # 当未到结束时间时, 循环请求

res = requests.get(url) # 请求查询结果接口

print(count)

count += 1

time.sleep(interval) # 休眠指定时间

if res: # 如果有数据则退出循环

break

else:

return None # 正常退出(达到end_time, 非break退出) 返回None

return res.json() # break退出返回 接口数据

if name == 'main':

# print(create_order())

print(get_order_result())

作者:一个老宅男

出处:

相关文章
|
10月前
|
JavaScript API
接口封装如何实现?
接口封装如何实现?
|
4月前
|
前端开发
请简述同步和异步的区别是什么
请简述同步和异步的区别是什么
52 2
|
4月前
|
Python
同步和异步的区别
同步和异步的区别
|
4月前
同步和异步的区别?
同步和异步的区别?
111 0
|
JavaScript 前端开发 UED
同步和异步区别
同步和异步区别
125 0
|
4月前
|
前端开发 JavaScript
同步和异步有什么区别
同步和异步有什么区别
130 0
|
存储 SQL 设计模式
C#异步有多少种实现方式?
C#异步有多少种实现方式?
|
消息中间件 前端开发 数据库
同步与异步详细区别
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
|
缓存 Java
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(一)
①. ThreadPoolExecutor谈谈你的理解? ②. 线程池的七大参数
169 0
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(一)
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(二)
③. 线程池的底层工作原理? ④. 线程池用过吗?生产上你是如何设置合理参数 ①. 线程池的拒绝策略请你谈谈 ②. 你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑
149 0
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(二)