POST 期间请求正文中的变量替换为 {}
Variable in request body replaced with {} during POST
我正在使用空手道 DSL(版本 0.6.1.1),我有以下情况:
Scenario:
Given url baseURL
* def email = "test_email@test_domain.com"
* def query = "SELECT * FROM public.users where username='" + email + "' ORDER BY user_id ASC"
* def dbUrl = databaseUrl + "databaseName"
* def config = { username: '#(databaseUsername)', password: '#(databasePassword)', url: '#(dbUrl)', driverClassName: 'org.postgresql.Driver' }
* def DbUtils = Java.type('utility.database.DbUtils')
* def db = new DbUtils(config)
* def results = db.readRow(query)
* def supplierId = results.user_id
* print "SUPPLIERID: " + supplierId
Given path '/path/to/endpoint'
And header content-type = 'application/json'
And request { supplierId: #(supplierId) }
When method POST
Then status 200
utility.database.DbUtils
是自定义的 class,readRow()
是 class 的单行成员,returns 是 JdbcTemplate.queryForMap(query)
的结果.
运行这个场景给出了如下日志:
10:53:17.477 [main] INFO com.intuit.karate - [print] SUPPLIERID: 957750e7-ee6b-486d-977c-05c8ac7bb589
10:53:17.506 [main] INFO com.intuit.karate - request:{
"supplierId": 957750e7-ee6b-486d-977c-05c8ac7bb589
}
10:53:18.372 [main] DEBUG com.intuit.karate -
1 > POST <a href="http://baseurl.com/path/to/endpoint" rel="nofollow noreferrer">http://baseurl.com/path/to/endpoint</a>
1 > Accept-Encoding: gzip,deflate
1 > Connection: Keep-Alive
1 > Content-Length: 17
1 > Content-Type: application/json
1 > Host: base.url.com
1 > User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_162)
{"supplierId":{}}
</pre>
可以看到一开始request body中supplierId
的值为957750e7-ee6b-486d-977c-05c8ac7bb589
。但是,一旦 POST 生成,supplierId
就只是 {}
。这似乎与 supplierId
由数据库调用填充这一事实有关。如果我用简单的 * def supplierId = "957750e7-ee6b-486d-977c-05c8ac7bb589"
替换对数据库的调用,请求正文会按预期显示。
为什么在调用 POST 时 supplierId
被替换为 {}
,我该如何阻止它这样做?
看来您的嵌入式表达式语法有误。我认为这一更改应该修复,请注意字符串引号:
And request { supplierId: '#(supplierId)' }
看起来是类型转换问题。我通过将 * def supplierId = results.user_id
替换为 * string supplierId = results.user_id
.
使其正常工作
我正在使用空手道 DSL(版本 0.6.1.1),我有以下情况:
Scenario:
Given url baseURL
* def email = "test_email@test_domain.com"
* def query = "SELECT * FROM public.users where username='" + email + "' ORDER BY user_id ASC"
* def dbUrl = databaseUrl + "databaseName"
* def config = { username: '#(databaseUsername)', password: '#(databasePassword)', url: '#(dbUrl)', driverClassName: 'org.postgresql.Driver' }
* def DbUtils = Java.type('utility.database.DbUtils')
* def db = new DbUtils(config)
* def results = db.readRow(query)
* def supplierId = results.user_id
* print "SUPPLIERID: " + supplierId
Given path '/path/to/endpoint'
And header content-type = 'application/json'
And request { supplierId: #(supplierId) }
When method POST
Then status 200
utility.database.DbUtils
是自定义的 class,readRow()
是 class 的单行成员,returns 是 JdbcTemplate.queryForMap(query)
的结果.
运行这个场景给出了如下日志:
10:53:17.477 [main] INFO com.intuit.karate - [print] SUPPLIERID: 957750e7-ee6b-486d-977c-05c8ac7bb589 10:53:17.506 [main] INFO com.intuit.karate - request:{ "supplierId": 957750e7-ee6b-486d-977c-05c8ac7bb589 } 10:53:18.372 [main] DEBUG com.intuit.karate - 1 > POST <a href="http://baseurl.com/path/to/endpoint" rel="nofollow noreferrer">http://baseurl.com/path/to/endpoint</a> 1 > Accept-Encoding: gzip,deflate 1 > Connection: Keep-Alive 1 > Content-Length: 17 1 > Content-Type: application/json 1 > Host: base.url.com 1 > User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_162) {"supplierId":{}} </pre>
可以看到一开始request body中
supplierId
的值为957750e7-ee6b-486d-977c-05c8ac7bb589
。但是,一旦 POST 生成,supplierId
就只是{}
。这似乎与supplierId
由数据库调用填充这一事实有关。如果我用简单的* def supplierId = "957750e7-ee6b-486d-977c-05c8ac7bb589"
替换对数据库的调用,请求正文会按预期显示。为什么在调用 POST 时
supplierId
被替换为{}
,我该如何阻止它这样做?
看来您的嵌入式表达式语法有误。我认为这一更改应该修复,请注意字符串引号:
And request { supplierId: '#(supplierId)' }
看起来是类型转换问题。我通过将 * def supplierId = results.user_id
替换为 * string supplierId = results.user_id
.