【问题标题】:How to retrieve JSON from request body using WebTau?如何使用 WebTau 从请求正文中检索 JSON?
【发布时间】:2022-06-10 23:05:00
【问题描述】:
  • 我已经向 REST servlet 发送了一个请求,它返回一个 JSON 数组

    • 我需要将 JSON 作为字符串获取以进行进一步处理。
  • 原来我是用这个来获取身体的:

    DataNode  result =  body.get("carList");`
    return result.toString();`
    
  • 然后尝试解析body,原来是JSON,但是……

  • 此字符串从Jackson 库中引发异常:

    "Unexpected character ('c' (code 99)): was expecting double-quote to start field name
      at [Source: (String)"[{carNumber: 22248002, trailerNumber: }]"; line: 1, column: 4]"
    
    • 这些是预期值。
    • 它们不是可识别的 JSON 格式。
  • 对于上面的例子,要求是:[ {"carNumber" : "1234", "trailerNumber" : "567"}, ... ]

  • 我还没有(还)在文档中找到一个示例或指导。

    • 我寻找诸如getJson()getRaw() 之类的东西。我确信它一定在那里。
    • 在这种情况下,我希望列表中的条目用于测试更新操作。

期待您的回复。

【问题讨论】:

    标签: json rest testing webtau


    【解决方案1】:

    WebTau的作者在这里,感谢您使用它。

    要获取 DataNode 基础值,请从验证块返回节点。如果节点表示对象,则将返回 Map 的实例。 List 用于 JSON 数组和对应类型,例如 StringBoolean 用于简单值

    Map<String, ?> bodyAsMap = http.get("/end-point", ((header, body) -> {
        return body;
    }));
    

    请注意,它还不是 JSON。此时,您可以使用任何标准库将 Map 转换回 JSON。或者使用 WebTau JsonUtils.serialize

    另外值得注意的是,它不是来自服务器的原始响应,而是解析到DataNode,再解析到Map,再解析到String。

    如果您需要验证 JSON 是否与架构确认,您可以直接使用它inside the validation block

    如果你需要原始的原始内容,你可以使用无证的http方法

    public HttpResponse getToFullUrl(String fullUrl, HttpHeader requestHeader)
    

    它返回的对象有getTextContent() 方法来访问最初收到的内容。

    能否请您详细说明为什么需要原始内容访问权限?如果有有用的模式,最好在 WebTau 本地启用它。

    【讨论】:

      【解决方案2】:

      随着事情的发展,我有点幸运,至少找到了一个可行的答案。首先要发现的是,在 lambda 主体中,您只能将值分配给编译器所称的:“有效地最终”。

      在这种情况下,我选择了StringBuilder,我猜可能是List&lt;String&gt;,某种容器。

      这是一个解决方案,虽然我还没有在文档中找到更好的方法。

        StringBuilder   jsonString  = new StringBuilder(100);
           :
        WebTauDsl.http.get(  callUrl,  restCallHeader, ((header, body) -> 
        {
            try 
            {
                DataNode result   = body.get("carList");
                JsonNode jsonNode = JsonUtils.convertToTree( result );
                      
                jsonString.append( jsonNode.toString() );     //  jsonString is "effectively final"
            }
            //  This is a @Test, bubble-up any Exception
        }));
      
        return jsonString.toString();    //  Return value to @Test caller
          
      

      发生了什么事?

      1. jasonString 是 REST 列表调用的输出/返回值。
      2. WebTau 有一些方便的 xpath,比如获取/检查正文内容的调用。 "carList" 是检索到的 carNumber 值的 JSON 数组。
      3. 使用帮助器类JaonUtil 将内容从get("carList") 转换为JsonNode。
        • 必须在 lambda 闭包内声明 JsonNode。
      4. jsonNode.toString() 为数组返回格式良好的 JSON 语法。
        • 您可能需要进一步解析来自jasonNode 的更多结构化对象。
        • 这个例子可能是一个好的开始。做我所做的,看看你可以从调试器中收集什么;-)
      5. 将 JSON 字符串值附加到 jasonString StringBuilder。
        • 在 lambda 之外声明 StringBuilder 满足“有效最终”约束。
        • 起初我有点担心这个错误。
      6. 最后将 JSON 字符串返回给调用此活动的 @Test 方法。
      • 我这样做是因为有几个集成测试用例需要使用该 carList 作为起点来模拟客户端工作流。
      • 您可能只想使用内联字符串。

      在这个例子中,我从 REST servlet 的 WebTau HTTP 调用中得到了格式良好的 JSON。现在这一切对我来说更有意义了,DataNode 是一个丰富的元数据结构,用于帮助常见的地方测试操作,例如检查是否返回列表 (isList()) 和检查字段值等。

      很高兴知道当您需要做更多事情时,尤其是在集成测试情况下,底层 REST 结构已经准备好并愿意投入使用。

      这是我幼稚的解决方案,似乎可行。我将暂时搁置“滴答”,以获得更好或更正确或“设计”的解决方案,这将对后来的人更有帮助。祝测试愉快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 2014-11-26
        • 2012-01-16
        • 2021-07-21
        • 2021-02-08
        • 2023-03-29
        相关资源
        最近更新 更多