0

给定以下 HTTP 响应:

{"id":"1", "name":test"}

目前,当您在“版本 > 首选项 > 项目设置 > 模块管理器 > JSON”中选中“将 JSON 请求/响应视为 xml 内容”(以便能够使用 xpath 而不是正则表达式)时,您完全没用像这样的东西:

<ObjectNode>
  <__children>
    <entry>
      <string>id</string>
      <__value>1</__value>
    </entry>
      etc...

注意:这是没用的,因为当您有深度 JSON 响应时,您的 XPath 如下: ArrayNode/__children/child::ObjectNode/__children/entry[child::string/text()='data']/ObjectNode/__children/entry [child::string/text()='id']/IntNode/__value

我设法创建了一个扩展,在其中解析 JSONObject 或 JSONArray 中的 JSON,然后调用

return "<root>"+XML.toString(json)+"</root>";

这给了我一个美丽的

<root><id>1</id><name>test</name></root>

注意:我可以使用 xpath 轻松处理

问题是然后 Neoload 将其转换为

<String>&lt;root&gt;&lt;id&gt;etc... 

这和第一个东西一样没用(可能更没用,因为 XPath 不再是一个选项,因为我只有一个节点)。

所以我的问题是如何改变 Neoload 转换解码器返回值的方式?

我曾尝试直接在解码器中返回 JSONObject 或 JSONArray,然后使用 Namer,但 Namer 似乎仅用于请求,而不用于响应。

任何提示表示赞赏!

4

1 回答 1

1

我发现模拟真实 JSON 的“更简单”的方法是执行以下操作。

首先,进行正常的网页调用并通过高级面板添加一个变量以捕获所有响应(要使用的正则表达式是 (.*))。

然后,使用带有以下内容的javascript(这里,EntryResponse 是捕获的变量名称)

//get the previous http response and eval it
var resp_ = context.variableManager.getValue("EntryResponse");
if (resp_ == null) {
        context.fail("Variable 'EntryResponse' not found");
}
logger.debug("EntryResponse="+resp_);
var resp = eval("("+resp_+")")

//then used resp as real json
logger.debug("Logged User Id="+resp.data.id);

// Inject a value in a runtime variable
context.variableManager.setValue("UserName", resp.data.id);

这并不像它可能的那么简单,但它比经典的 XPath 更强大、更容易

于 2014-10-30T10:34:28.257 回答