【问题标题】:Variable in request body replaced with {} during POSTPOST 期间请求正文中的变量替换为 {}
【发布时间】:2018-06-11 18:39:40
【问题描述】:

我使用的是空手道 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 是一个自定义类,readRow() 是该类的单行成员,它返回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 @987654322@
    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":{}}

您可以看到,最初请求正文的值为supplierId957750e7-ee6b-486d-977c-05c8ac7bb589。但是,一旦发布了 POST,supplierId 就是 {}。这似乎与supplierId 由数据库调用填充的事实有关。如果我用简单的* def supplierId = "957750e7-ee6b-486d-977c-05c8ac7bb589" 替换对数据库的调用,请求正文将按预期显示。

为什么在进行 POST 调用时将 supplierId 替换为 {},我该如何阻止它这样做?

【问题讨论】:

    标签: rest karate


    【解决方案1】:

    看起来您的嵌入式表达式语法错误。我认为这一更改应该可以解决,请注意字符串引号:

    And request { supplierId: '#(supplierId)' }
    

    【讨论】:

    • 感谢您的回复。不过,我仍然得到与引号相同的结果。
    • 好的,这属于“为我工作”类别。不知道你的 json 是什么,只是一个猜测,试试:* def supplierId = results.user_id.supplierId - 如果失败了,我只能建议,请按照以下说明操作:github.com/intuit/karate/wiki/How-to-Submit-an-Issue
    • 非常感谢您的回答。
    【解决方案2】:

    看起来这是一个类型转换问题。我通过将* def supplierId = results.user_id 替换为* string supplierId = results.user_id 来实现它。

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多