¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo enviar un archivo con FormData y fetch a una API REST externa

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 232 Vistas
0
Cargando...

Hola Comunidad CAP,

Estoy intentando enviar un archivo como FormData a una API REST externa. Estoy siguiendo la documentación aquí: https://cap.cloud.sap/docs/node.js/services#srv-send

Usando fetch fue bastante sencillo y está funcionando bien:

        const imageBuffer = fs.readFileSync('./testfiles/filename.png')

        const form = new FormData()
        form.append('file', imageBuffer, {
            contentType: 'text/plain',
            name: 'file',
            filename: 'filename.png'
        })

        const headers = {
            'Authorization': 'Basic ' + btoa(process.env.LOGIN)
        }

        const url = process.env.URL + '/my/api/path' 

        const response = await fetch(url, {
            method: 'POST',
            headers: headers,
            body: form,
        })

        if (!response.ok) throw new Error(`respuesta inesperada ${response.statusText}`)  
        //¡Hurra! Funciona

Luego agregué la información de conexión a la API al package.json:

  "cds": {
    "requires": {
      "myAPI": {
        "kind": "rest",
        "credentials": {
          "url": ...,
          "authentication": "BasicAuthentication",
          "username": ...,
          "password": ...,
          "requestTimeout": 30000
        }
      }
   }
 }
            
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola johannesvogel ,

finalmente tuve tiempo para probar y puedo confirmar que ahora funciona.

            const response = await myAPI.send({                method: 'POST',                path: apiPath,                data: form,                headers: {                    'Content-Type': 'multipart/form-data',                    'Accept': 'multipart/mixed'                }            })

Pero esto me lleva a otra pregunta. ¿Hay alguna manera de acceder al encabezado de la respuesta? En este momento, la respuesta solo contiene los datos respondidos. Pero como es multipart/mixed , tengo que analizar la respuesta usando el límite devuelto, que está incluido en el tipo de contenido.

Content-Type: multipart/mixed;boundary=Boundary_1229_117813444_54355453674;charset=UTF-8

Usando fetch, simplemente podría usar response.headers.get('content-type') , para obtener la información del límite. ¿Pero cómo acceder a los encabezados al usar CAP, ya que response.headers es indefinido? ¿Por qué no devuelve el objeto de respuesta axios plano?

Gracias y saludos

Nico

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Nico,

Creo que con la versión 6.0.3 hemos solucionado este problema.

La razón fue que el encabezado de longitud de contenido se calculó incorrectamente y, por lo tanto, la aplicación remota está esperando más datos para procesar y finalmente se detiene por tiempo de espera.

Saludos cordiales,

Johannes

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Johannes,

Intenté agregar el tipo de contenido de esta manera:

                        const response2 = await myAPI.tx(req).send({                method: 'POST',                path: '/my/api/path',                data: form,                headers: {                    'Content-Type': 'multipart/form-data'                }            })

Pero aún devuelve el mensaje de tiempo de espera: "Error durante la solicitud al servicio remoto: Solicitud fallida con código de estado 408"

Aquí está la salida completa:

[cds] - POST /browse/submitFile[cds] - connect to converter > rest {  url: 'XXXXXXXXXXXXXXXXXXX',  requestTimeout: 30000,  authentication: '...',  username: '...',  password: '...'}[remote] - Error: Error durante la solicitud al servicio remoto: Solicitud fallida con código de estado 408    at createError (/workspaces/projects/Converter_CAP/node_modules/axios/lib/core/createError.js:16:15)    at settle (/workspaces/projects/Converter_CAP/node_modules/axios/lib/core/settle.js:17:12)    at IncomingMessage.handleStreamEnd (/workspaces/projects/Converter_CAP/node_modules/axios/lib/adapters/http.js:269:11)    at IncomingMessage.emit (events.js:412:35)    at endReadableNT (internal/streams/readable.js:1334:12)    at processTicksAndRejections (internal/process/task_queues.js:82:21) {  config: {    url: '/my/api/path',    method: 'post',    proxy: false,    baseURL: 'XXXXXXXXXXXXXXXXXXX',    timeout: 30000,    xsrfCookieName: 'XSRF-TOKEN',    xsrfHeaderName: 'X-XSRF-TOKEN',    maxContentLength: -1,    maxBodyLength: -1  },  request: {    method: 'POST',    url: 'XXXXXXXXXXXXXXXXXXX/my/api/path',    headers: {      Accept: 'application/json,text/plain',      'Content-Type': 'multipart/form-data',      authorization: 'Basic ...',      'accept-language': 
        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Nico,

¿Podrías intentar establecer manualmente el encabezado "content-type" con .send?

El valor predeterminado es "application/json", que no se ajusta a tu contenido.

Por favor, también incluye el mensaje de error, ya que podría dar una pista sobre lo que está causando el problema.

Saludos cordiales,

Johannes

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?