FormData 对象为空,即使它在尝试将 pdf 文件作为多部分 FormData POST 请求发送到赛普拉斯时被设置

FormData object is empty even though it is being set when trying to send a pdf file as a multipart FormData POST request in Cypress

我想将 pdf 文件作为 POST 请求发送。

API接受@RequestPart@RequestParam

@RequestPart("file") MultipartFile file;
@RequestParam(value = "document-types", required = false) Set<String> documentTypes;

我试过这样做:

it('test', () => {
    cy.fixture(pdfFilePath, "binary").then(file => {
        const data = new FormData();
        data.set('file', file);
        data.set('document-types', 'New Type');
        cy.request({
            method: "POST",
            url: '/api/v4/documents',
            headers: {
            accepts: "multipart/form-data",
            authorization: authString
            },
            body: data
        }).then((response) => {
            expect(response.status).to.eq(200)
        });
    });
});

当我 运行 我得到:

Status: 400 - Bad Request

在 Cypress 中,我看到发送的请求中的正文是空的: Body: {}

当我尝试调试代码时,我看到 data 被发送为空,正如您在随附的屏幕截图中看到的那样:

我想知道为什么,因为我尝试通过在上面的屏幕截图的第 154 行和第 155 行执行这些步骤来设置 data

data.set('file', file);
data.set('document-types', 'New Type');

我在这里错过了什么?

赛普拉斯版本:9.0.0

这不是空的,你必须利用data.entries()来查看内容。

似乎 cy.request() 函数试图将 FormData 对象转换为错误的 JSON 对象。

documentation of cypress 开始,您还应该使用 form: true 设置。

参考文献:

你必须附加formData,下面的代码只是一个例子:

    const formData = new FormData()
    formData.append('file', files[0])
    formData.append('name', files[0].name)

正如@Christopher 在回答中提到的,data 不是空的。我不得不使用 data.entries() or simply data.get() 来查看内容。

但无论如何我无法使该代码正常工作。

相反,我遵循了 this youtube 视频中介绍的方法并且有效。

it.only('test', () => {
    function form_request(method, url, formData, done) {
        const xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.setRequestHeader(
            "Authorization",
            "Basic YWRtaW46YWRtaW4="
        );
        xhr.onload = function () {
            done(xhr);
        };

        xhr.onerror = function () {
            done(xhr);
        };

        xhr.send(formData);
    }

    const fileName = "PdfFileName.pdf";
    const method = "POST";
    const url = '/api/v4/documents';
    const fileType = "application/pdf"

    cy.fixture(pdfFilePath, "binary")
        .then((txtBin) => Cypress.Blob.binaryStringToBlob(txtBin))
        .then((blob) => {
            const formData = new FormData();
            formData.append("file", blob, fileName);
            formData.append("document-types", "New Type");
            form_request(method, url, formData, function (response) {
                expect(response.status).to.eq(200);
            })
    });
})