当 logPrettyResponse 为 true 且响应内容类型为“text/turtle”时,Karate SAXParseException;

发布于 2025-01-11 08:17:47 字数 1774 浏览 0 评论 0原文

它看起来像一个错误,但提出问题以防万一我错过了一些东西。

空手道版本是1.1.0

发布请求如下。请注意,内容类型是 text/turtle,我使用 logPrettyResponse,因为测试中的进一步请求正在测试 RDF/XML 和其他序列化。

    * configure logPrettyResponse = true

    Given path '/graph'
    * text payload =
      """
        <http://example.com/a7460f22-561a-4dde-922b-665bd9cf3bd9> <http://schema.org/description> "Test"@en.
      """
    And request payload
    And header Accept = 'text/turtle'
    And header Content-Type = 'text/turtle'
    When method POST
    Then status 200


我得到以下错误

ERROR com.intuit.karate - org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 8; Element type "http:" must be followed by either attribute specifications, ">" or "/>"., http call failed

发生这种情况的原因似乎是 JsValue.java 中的 fromString 方法正在尝试将海龟解析为 XML,因为条件 case '<' 为 true反应是乌龟。

   public static Object fromString(String raw, boolean jsonStrict, ResourceType resourceType) {
        String trimmed = raw.trim();
        if (trimmed.isEmpty()) {
            return raw;
        }
        if (resourceType != null && resourceType.isBinary()) {
            return raw;
        }
        switch (trimmed.charAt(0)) {
            case '{':
            case '[':
                return jsonStrict ? JsonUtils.fromJsonStrict(raw) : JsonUtils.fromJson(raw);
            case '<':
                if (resourceType == null || resourceType.isXml()) {
                    return XmlUtils.toXmlDoc(raw);
                } else {
                    return raw;
                }
            default:
                return raw;
        }
    }

为了解决这个问题,我将 logPrettyResponse 设置为 false。我很想知道是否有人有其他想法或者是否有人可以确认这是一个错误?

It looks like a bug but asking the question just in case I have missed something.

Karate version is 1.1.0

The post request is as below. Note that content type is text/turtle and I use logPrettyResponse because further requests in test are testing RDF/XML and other serialisations.

    * configure logPrettyResponse = true

    Given path '/graph'
    * text payload =
      """
        <http://example.com/a7460f22-561a-4dde-922b-665bd9cf3bd9> <http://schema.org/description> "Test"@en.
      """
    And request payload
    And header Accept = 'text/turtle'
    And header Content-Type = 'text/turtle'
    When method POST
    Then status 200


And I get below error

ERROR com.intuit.karate - org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 8; Element type "http:" must be followed by either attribute specifications, ">" or "/>"., http call failed

Reason this seems to be happening is that fromString method in JsValue.java is trying to parse turtle as XML because condition case '<' is true when response is turtle.

   public static Object fromString(String raw, boolean jsonStrict, ResourceType resourceType) {
        String trimmed = raw.trim();
        if (trimmed.isEmpty()) {
            return raw;
        }
        if (resourceType != null && resourceType.isBinary()) {
            return raw;
        }
        switch (trimmed.charAt(0)) {
            case '{':
            case '[':
                return jsonStrict ? JsonUtils.fromJsonStrict(raw) : JsonUtils.fromJson(raw);
            case '<':
                if (resourceType == null || resourceType.isXml()) {
                    return XmlUtils.toXmlDoc(raw);
                } else {
                    return raw;
                }
            default:
                return raw;
        }
    }

To solve the problem I have set logPrettyResponse to false. I would love to know if anyone has any other thoughts or if someone can confirm that it is a bug?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文