首页 > 解决方案 > 使用 XML 内容作为请求正文时,如何防止 REST Assured POST 请求丢弃 XML 声明标记?

问题描述

我使用 REST Assured 来测试将 XML 文件上传到数据库。后端代码写得很好,没有错误。我像这样使用 REST Assured 构建请求(.body() 方法来自 REST Assured 的 RequestSpecification 类,它扩展了 RequestSender 类)。

response = TestSuite.buildRequest()
            .contentType("text/xml")
            .header("header1")
            .accept("application/json")
            .body(uploadPayload)
            .post(uploadPath)

uploadPayload 是一个带有 XML 声明标签的 XML 文件内容。这是一个示例文件内容,

<?xml version="1.0" encoding="UTF-8" ?>
<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
</CATALOG>

此内容是从项目目录中的文件中读取的,这是我用来读取此文件内容的方法,它会读取具有所有格式的整个文件。

public static String getFileContent(File file) {

    if (file == null) return

    String s = ""

    try {
        FileReader reader = new FileReader(file)
        BufferedReader br = new BufferedReader(reader)

        String line
        while ((line = br.readLine()) != null) {
            s = s + line + "\n"
        }
        return s
    } catch (IOException e) {
        throw new IOException("Error getting file content from file.", e)
    }
}

我所做的就是将此获得的文件内容添加为请求正文(上述请求的 uploadPath 变量)并发送请求。但是在执行测试时,结果中显示的正文没有 XML 声明标记。但是当我打印内容时,标签就在那里。这就是正文在测试结果中的显示方式(没有 XML 声明标记)。

<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
</CATALOG>

我需要获取请求的整个正文(包括声明标签)。但是由于某种原因,它在到达请求正文时被丢弃。有人可以告诉我为什么以及克服这个问题的方法吗?非常感谢您的反馈。谢谢你。

标签: xmlrest-assured

解决方案


通过对此进行一些研究,我发现 XML 声明标记因请求中使用的内容类型(文本/xml)而被删除。这个关于application/xml 和 text/xml 之间区别的链接清楚而简单地解释了这一点。

引用链接,

“根据标准,text/*-MIME 类型具有 us-ascii 字符集,除非在 HTTP 标头中另有指定。这实际上意味着忽略 XML 序言中定义的任何编码。这当然不是预期和期望的行为。”


推荐阅读