Karate工具问题:无法将API响应提取的Header值传入另一API请求头
问题场景
我将ETag的值存储到变量etag后,打印显示为["3"]:
Given path '/price/v4/quote/',quoteId,'/products' And request requestPayload When method POST - print 'headers:', karate.prevRequest.headers Then status 200 And def etag = responseHeaders['ETag'] - print etag [print] ["3"]
随后把这个变量传入另一个API的请求头:
* header If-Match = etag Given path '/price/v4/quote/',quoteId,'/accept' And request requestPayload When method PUT * print 'headers:', karate.prevRequest.headers Then status 200 * print karate.pretty(response)
结果因ETag头格式错误触发报错:
Got invalid quoteVersion for quote 'b25f50bc-0479-4390-b4fe-0620fc6c6139'. quoteVersion '[\"3\"]', actualVersion '3'
解决方法
Karate里responseHeaders的每个头字段值都是数组类型(HTTP协议允许同名字段存在多个值),所以你拿到的etag是包含单个元素的数组["3"],直接赋值会把数组格式带入请求头。
只需要取数组的第一个元素即可修正格式:
And def etag = responseHeaders['ETag'][0]
修改后etag的值变为字符串"3",再设置到If-Match头就符合接口要求了。
完整修正后的代码片段:
Given path '/price/v4/quote/',quoteId,'/products' And request requestPayload When method POST Then status 200 And def etag = responseHeaders['ETag'][0] // 提取数组第一个元素 - print etag // 此时打印结果为"3" * header If-Match = etag Given path '/price/v4/quote/',quoteId,'/accept' And request requestPayload When method PUT Then status 200
额外提示
如果不确定ETag头是否存在多个值,也可以用Karate的first()函数安全获取第一个元素:
And def etag = first(responseHeaders['ETag'])
内容的提问来源于stack exchange,提问作者Mohit Joshi
相关产品推荐
相关产品推荐

