You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate框架下SOAP请求全流程按条件最多重试5次实现咨询

解决方案

核心实现思路

  • 把「查库取数→构造SOAP请求→发请求→校验响应」的完整流程封装为可重复调用的逻辑
  • 外层控制最多5次重试,每次调用都会重新执行全流程更新请求参数
  • 某次调用满足response.id > 5000则直接终止流程,5次全部失败则主动抛出用例失败异常

完整代码示例

Scenario: 循环重试发送SOAP请求直到满足条件
  # 封装全流程重试逻辑,最多执行5次
  * def runFullFlow =
    """
    function() {
      for (let retryCount = 1; retryCount <= 5; retryCount++) {
        karate.log('当前是第', retryCount, '次执行全流程');
        // 步骤1:生成随机数查询范围
        var randomNum = db.readRows("select trunc(dbms_random.value(10000000, 10010000)) min, trunc(dbms_random.value(10200000, 10250000)) max from dual")
        // 步骤2:查询目标数据,无数据直接进入下一次重试
        var holderFromDB = db.readRows("SELECT productId, userId from table1 WHERE id between "+randomNum[0].MIN+" and "+randomNum[0].MAX+" ")
        if (holderFromDB.length < 1) {
          karate.log('第', retryCount, '次查库无匹配数据,进入重试');
          continue;
        }
        // 步骤3:构造SOAP请求体
        var productId = holderFromDB[0].productId;
        var userId = holderFromDB[0].userId;
        var javaclass = Java.type('epos.positionmanagement.service.test.GetSpendingLimitRequestTest')
        var map = {deviceTypeId: 2, entityId: defaultEntity, ppr_id: productId, userId: userId }
        var requestBody = javaclass.getPayload(map)
        karate.log('本次请求体:', requestBody)
        // 步骤4:发送SOAP请求
        var response = karate.call('@sendSoapRequest', {reqBody: requestBody})
        // 步骤5:校验响应是否符合要求
        var revisionId = karate.get(response, "//GetSpendingLimitResponse/spendingLimit/totalAmount") * 1;
        if (revisionId > 5000) {
          karate.log('校验通过,revisionId=', revisionId, ',终止重试流程');
          return {success: true, response: response};
        }
        karate.log('第', retryCount, '次校验不通过,revisionId=', revisionId);
      }
      // 5次重试全部失败,抛出用例失败异常
      karate.fail('5次重试全部结束,仍未满足校验条件,用例执行失败');
    }
    """
  # 执行重试逻辑
  * def execResult = call runFullFlow

  # 封装SOAP请求可复用片段
  @sendSoapRequest
  * def sendSoapRequest =
    """
    function(params) {
      Given request params.reqBody
      When soap action 'Request'
      Then status 500
      karate.log('本次响应结果:', response)
      return response;
    }
    """

注意事项

  • JS逻辑中直接传递变量即可,不需要加#()包裹,该占位符仅适用于Karate原生JSON表达式解析场景
  • 所有DB查询、请求构造逻辑都放在循环内部,保证每次重试都会生成全新的请求参数
  • 若需要控制重试间隔,可以在重试逻辑前加java.lang.Thread.sleep(1000)调整等待时长,单位为毫秒

内容的提问来源于stack exchange,提问作者Rohit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:04