Quiero enviar el archivo pdf como una solicitud POST.
La API acepta @RequestPart y @RequestParam :
@RequestPart("file") MultipartFile file; @RequestParam(value = "document-types", required = false) Set<String> documentTypes;Traté de hacerlo de esa manera:
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) }); }); });Y cuando ejecuto esto me sale:
Status: 400 - Bad Request
En Cypress veo que el cuerpo de la solicitud enviada está vacío: Body: {}
Cuando traté de depurar el código, veo que data se envían vacíos como se ve en la captura de pantalla adjunta:
Y me pregunto por qué porque trato de configurar los data siguiendo estos pasos en las líneas 154 y 155 en la captura de pantalla anterior:
data.set('file', file); data.set('document-types', 'New Type');¿Que me estoy perdiendo aqui?
Versión de ciprés: 9.0.0
debe agregar formData, el código a continuación es solo un ejemplo:
const formData = new FormData() formData.append('file', files[0]) formData.append('name', files[0].name)No está vacío, debe utilizar data.entries() para ver el contenido.
Parece que la función cy.request() intenta convertir el objeto FormData en un objeto JSON, lo cual es incorrecto.
De la documentación de ciprés también debe hacer uso de la form: true .
Referencias:
Como @Christopher mencionó en la respuesta, data no estaban vacíos. Tuve que usar data.entries() o simplemente data.get() para ver el contenido.
Pero de todos modos, no pude hacer que ese código funcionara.
En cambio, seguí el enfoque presentado en este video de YouTube y funcionó.
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); }) }); })