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);
})
});
})
我想将 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);
})
});
})