批量调用

为什么要批量调用

可以提高应用性能,更快的响应 比如做一个页面需要调用 7 个不同接口拉取数据,然后渲染页面。这种情况下, 如想加快页面响应,可能会考虑并发发起 7 次调用等到数据都返回来再进行页面渲染。但是这样的编程模型对于调用者来说响应时间会比较长且调用繁琐,如果框架把 7 次调用通过内部并行的方式来完成,1 次调用返回多个数据结果,那则可以大大提高每次请求响应时间,减少网络请求的次数。

使用更少的流量 单次 API 调用会传重复的系统或者业务入参,比如:sign、method、timestamp、token 等参数,在很多情况下这些重复参数占用了请求体里面的大部分空间。API 批量调用可以将这些参数在协议层面上进行合并,实现参数的复用。对于移动端调用、服务端高并发调用中优化网络使用是很有帮助的。

批量调用特性

  • 支持目前所有安全和业务特性
  • 支持除文件上传外的所有 API 自由组合调用
  • 支持多 session 混合调用
  • 调用结果互不干扰
  • API 响应顺序和请求顺序完全一致,无需排序或按编号查询结果
  • 极速体验,M 次交易 API+N 次商品 API 调用
  • 公共参数和方法名称可进行合并,精简请求报文
  • 简单的调用协议,使用 HTTP 协议快速实现批量 API 调用

使用调用

  1. 唯一 URL 请求地址入口,支持GETPOST,建议使用POST

    1. http|https://host/api/batch
  2. 请求参数,建议使用POST请求,参数存放在 HTTP Body 体中,与单接口调用对比,需要去除method字段,增加batch字段,类型为array,每一个object代表一个单接口;

    1. {
    2. "appkey": "12345678",
    3. "token": "test",
    4. "sign": "694d5cee85def32fac63bd6c1896c41c",
    5. "timestamp": "1523553249",
    6. "format": "json",
    7. "batch": [
    8. {
    9. "version": "v1",
    10. "controller": "Order",
    11. "method": "timeout.order.cancel"
    12. },
    13. {
    14. "version": "v1",
    15. "controller": "Order",
    16. "method": "timeout.order.complete"
    17. }
    18. ]
    19. }
  3. batch字段对象参数,除了下列字段外,额外存在的将会被当做业务参数处理;

    1. version 对应单接口调用中的 `API 版本号`
    2. controller 对应单接口调用中的 `控制器`
    3. method 对应公共参数中的 `业务方法`

返回数据

批量调用接口返回的数据结构与单接口一致,需要说明的是结构体最上层的status字段代表批量调用状态,只有批量调用成功的状态下才会返回data字段。而data字段中的每一个object可以理解为多个单接口调用的集合,其中status字段代表改单接口的状态,每个object的状态都是独立的,任何其中一个失败并不会影响其他object

还需要指出data字段中的每个object都是根据请求(batch字段)顺序排序的,并且会将version controller method三个字段原样输出。

  1. {
  2. "status": 200,
  3. "message": "success",
  4. "data": [
  5. {
  6. "status": 200,
  7. "message": "success",
  8. "version": "v1",
  9. "controller": "Order",
  10. "method": "timeout.order.cancel",
  11. "data": true
  12. },
  13. {
  14. "status": 200,
  15. "message": "success",
  16. "version": "v1",
  17. "controller": "Order",
  18. "method": "timeout.order.complete",
  19. "data": true
  20. }
  21. ]
  22. }

场景演示

假设现在需要将一批商品为设置热卖,并且通过搜索获取一批商品,还故意将一个接口参数设置错误,按照以往操作需要进行三次接口调用、三次签名、三次拼接参数等各种重复的操作,而现在批量调用一次就能完成。

  1. 拼接参数
    1. {
    2. "appkey": "12345678",
    3. "token": "test",
    4. "sign": "694d5cee85def32fac63bd6c1896c41c",
    5. "timestamp": "1523553249",
    6. "format": "json",
    7. "batch": [
    8. {
    9. "version": "v1",
    10. "controller": "app",
    11. "method": "get.app.item"
    12. },
    13. {
    14. "version": "v1",
    15. "controller": "goods",
    16. "method": "set.hot.goods.list",
    17. "goods_id": [1,3,4,6],
    18. "is_hot": 1
    19. },
    20. {
    21. "version": "v1",
    22. "controller": "goods",
    23. "method": "get.goods.admin.list",
    24. "name": "编辑"
    25. }
    26. ]
    27. }
  2. https://host/api/batch发送请求

  3. 返回数据

    1. {
    2. "status": 200,
    3. "message": "success",
    4. "data": [
    5. {
    6. "status": 500,
    7. "message": "应用编号不能为空",
    8. "version": "v1",
    9. "controller": "app",
    10. "method": "get.app.item",
    11. "data": false
    12. },
    13. {
    14. "status": 200,
    15. "message": "success",
    16. "version": "v1",
    17. "controller": "goods",
    18. "method": "set.hot.goods.list",
    19. "data": true
    20. },
    21. {
    22. "status": 200,
    23. "message": "success",
    24. "version": "v1",
    25. "controller": "goods",
    26. "method": "get.goods.admin.list",
    27. "data": {
    28. "items": [
    29. {
    30. "goods_id": 1,
    31. "goods_category_id": 2,
    32. "name": "编辑一个商品",
    33. "short_name": "",
    34. "product_name": "",
    35. "goods_code": "CS73765853",
    36. "goods_spu": "",
    37. "goods_sku": "",
    38. "bar_code": "",
    39. "brand_id": 0,
    40. "store_qty": 62,
    41. "comment_sum": 1,
    42. "sales_sum": 24,
    43. "measure": 10,
    44. "measure_type": 0,
    45. "is_postage": 0,
    46. "market_price": 150,
    47. "shop_price": 10,
    48. "give_integral": 150,
    49. "is_integral": 1000000,
    50. "least_sum": 1,
    51. "purchase_sum": 0,
    52. "keywords": "",
    53. "description": "",
    54. "content": "描述",
    55. "attachment": [],
    56. "video": "",
    57. "unit": "",
    58. "is_recommend": 0,
    59. "is_new": 0,
    60. "is_hot": 1,
    61. "goods_type_id": 1,
    62. "sort": 50,
    63. "status": 1,
    64. "is_delete": 0,
    65. "create_time": "2017-04-20 23:59:41",
    66. "update_time": "2018-04-19 00:10:58"
    67. }
    68. ],
    69. "total_result": 1
    70. }
    71. }
    72. ]
    73. }