Avalados por :

Como enviar um arquivo com FormData e fetch para uma API REST externa

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

Olá Comunidade CAP,

Estou tentando enviar um arquivo usando FormData para uma API REST externa. Estou seguindo a documentação aqui: https://cap.cloud.sap/docs/node.js/services#srv-send

Usar fetch foi bastante simples e está funcionando bem:

        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(`resposta inesperada ${response.statusText}`)  
        //Hurra! Funciona

Depois, adicionei as informações de conexão à API no 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...

Olá johannesvogel ,

Finalmente tive tempo para testar e posso confirmar que agora funciona.

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

Mas isso me leva a outra pergunta. Existe alguma maneira de acessar o cabeçalho da resposta? No momento, a resposta contém apenas os dados respondidos. Mas como é multipart/mixed , tenho que analisar a resposta usando o limite retornado, que está incluído no tipo de conteúdo.

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

Usando fetch, eu poderia simplesmente usar response.headers.get('content-type') , para obter as informações do limite. Mas como acessar os cabeçalhos ao usar CAP, já que response.headers é indefinido? Por que não retorna o objeto de resposta axios plano?

Obrigado e cumprimentos

Nico

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

Olá Nico,

Acredito que com a versão 6.0.3 tenhamos resolvido este problema.

A razão foi que o cabeçalho de comprimento de conteúdo foi calculado incorretamente e, portanto, o aplicativo remoto está esperando mais dados para processar e, finalmente, pára devido ao tempo limite.

Atenciosamente,

Johannes

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

Olá Johannes,

Tentei adicionar o tipo de conteúdo desta forma:

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

Mas ainda recebo a mensagem de tempo limite: "Erro durante a solicitação ao serviço remoto: Solicitação falhou com código de status 408"

Aqui está a saída completa:

[cds] - POST /browse/submitFile[cds] - conectar a conversor > rest {  url: 'XXXXXXXXXXXXXXXXXXX',  requestTimeout: 30000,  authentication: '...',  username: '...',  password: '...'}[remote] - Erro: Erro durante a solicitação ao serviço remoto: Solicitação falhou com código de status 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...

Olá Nico,

Você poderia tentar definir manualmente o cabeçalho "content-type" com .send?

O valor padrão é "application/json", que não se ajusta ao seu conteúdo.

Por favor, inclua também a mensagem de erro, pois pode fornecer uma pista sobre o que está causando o problema.

Atenciosamente,

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?