Karate工具中API请求动态值传递问题:请求参数未替换
解决Karate中API请求体动态时间戳不替换的问题
我懂你遇到的困扰——明明打印CurrentTime能输出正确的时间戳,但请求体里的time参数就是没法被替换成这个动态值,反而可能把CurrentTime当成字符串字面量发送出去对吧?这是Karate处理JSON请求体时的一个常见细节问题,咱们一步步解决它:
问题根源
Karate的request关键字接收的JSON对象,默认会把其中的键值对当成纯JSON内容。如果你直接写time:CurrentTime,Karate不会把它识别为变量引用,而是会把CurrentTime作为字符串发送给API。要让Karate解析变量,必须用它的变量插值语法:#(变量名)。
第一步:修正Date.feature的小错误
先看你的Date.feature里的Java代码,new java.util.date()里的date应该大写为Date(Java类名区分大小写),不然会抛出类找不到的异常:
Background: Setup * def pattern = 'MM/dd/yy hh.mm.ss' * def getDate = """ function(){ var SimpleDateFormat = Java.type('java.text.SimpleDateFormat'); var sdf = new SimpleDateFormat(pattern); var date = new java.util.Date(); // 这里D必须大写 return sdf.format(date); } """ Scenario: Capture current date and time * string CurrentTimeStamp = getDate()
第二步:修改主Feature的请求体
把请求体里的CurrentTime用#()包裹,告诉Karate这是一个变量需要替换:
Background: * def TimeStamp = call read('classpath:Api/Mobile/Date.feature') * def CurrentTime = TimeStamp.CurrentTimeStamp Scenario: Client data is received Given Url 'https://xxxxx/schd/migration' And request {cn:1234,name:'Kiran',time:#(CurrentTime)} // 用#()插值变量 When method post And print CurrentTime Then print response Date
额外优化:用Karate内置函数简化时间处理
其实Karate自带了时间格式化的内置函数karate.formatDate(),完全不用自己写Java代码,能大幅简化Date.feature:
Background: Setup * def pattern = 'MM/dd/yy hh.mm.ss' Scenario: Capture current date and time * string CurrentTimeStamp = karate.formatDate(pattern, karate.now())
karate.now()会获取当前时间,karate.formatDate()用指定的格式把它转成字符串,比自己写Java函数更简洁也不容易出错。
这样修改后,请求体里的time参数就会被正确替换成动态生成的时间戳了,你可以再运行测试验证一下~
内容的提问来源于stack exchange,提问作者Kiran28
相关产品推荐
相关产品推荐

