1
resposta

Preciso enviar uma variavel ou um arquivo em xml e não consigo

Preciso enviar uma variável (ou um arquivo em xml). Já tentei de tudo. Uso o js2xml para criar a variável. Estou tentando enviar pelo Axios.

var options = { compact: true, ignoreComment: false, spaces: 4 };
 var agoravai = convert.js2xml(dadosProduto, options)
 const headerBling = {
                headers: {
                    'Accept': "application/xml ",
                    'Content-Type': 'Content-Type: text/xml',
                    'x-api-key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
                },

            };
        este código cria a variável abaixo:
<produtosLoja>
    <produtoLoja>
        <idLojaVirtual>47986</idLojaVirtual>
        <preco>
            <preco>9.38</preco>
            <precoPromocional>8.34</precoPromocional>
        </preco>
    </produtoLoja>
</produtosLoja>

esta é a url: var urlPost = https://bling.com.br/Api/v2/produtoLoja/${produto.idLojaVirtual}/${produto.produtoid}/json/&apikey=${process.env.APIKEY}

Tive de criar um objeto abaixo para dar entrada com os parâmetros na função

 let vamosVer = {
                urlPost: urlPost,
                agoravai: agoravai,
                headerBling: headerBling
            }

eu envio por este código com Axios: Não ligue para os nomes das variáveis. São temporários. Tentei tanta coisa que já fiquei sem criatividade.

axios.put(vamosVer.urlPost, vamosVer.agoravai, vamosVer.headerBling)
           .then((response) => { response.data })
           .catch((err) => { console.log(err) })
       
           obtenho a mensagem de erro abaixo.
           [AxiosError: Request failed with status code 400] {
 code: 'ERR_BAD_REQUEST',
 config: {
   transitional: {
     silentJSONParsing: true,
     forcedJSONParsing: true,
     clarifyTimeoutError: false
   },
   adapter: [Function: httpAdapter],
   transformRequest: [ [Function: transformRequest] ],
   transformResponse: [ [Function: transformResponse] ],
   timeout: 0,
   xsrfCookieName: 'XSRF-TOKEN',
   xsrfHeaderName: 'X-XSRF-TOKEN',
   maxContentLength: -1,
   maxBodyLength: -1,
   env: { FormData: [Function] },
   validateStatus: [Function: validateStatus],
   headers: {
     Accept: 'application/xml ',
     'Content-Type': 'Content-Type: text/xml',
     'x-api-key': '792ad75c36751ede5e23fc8da919b5f4edc0962dcb8811166d4a70fe9c7323033bd65e15',
     'User-Agent': 'axios/0.27.2',
     'Content-Length': 231
   },
   method: 'put',
   url: 'https://bling.com.br/Api/v2/produtoLoja/203975574/17898994187620/json/&apikey=792ad75c36751ede5e23fc8da919b5f4edc0962dcb8811166d4a70fe9c7323033bd65e15',
   data: '<produtosLoja>\n' +
     '    <produtoLoja>\n' +
     '        <idLojaVirtual>47986</idLojaVirtual>\n' +
     '        <preco>\n' +
     '            <preco>9.38</preco>\n' +
     '            <precoPromocional>8.34</precoPromocional>\n' +
     '        </preco>\n' +
     '    </produtoLoja>\n' +
     '</produtosLoja>'
 },
 request: <ref *1> ClientRequest {
   _events: [Object: null prototype] {
     abort: [Function (anonymous)],
     aborted: [Function (anonymous)],
     connect: [Function (anonymous)],
     error: [Function (anonymous)],
     socket: [Function (anonymous)],
     timeout: [Function (anonymous)],
     prefinish: [Function: requestOnPrefinish]
   },
   _eventsCount: 7,
   _maxListeners: undefined,
   outputData: [],
   outputSize: 0,
   writable: true,
   destroyed: false,
   _last: true,
   chunkedEncoding: false,
   shouldKeepAlive: false,
   maxRequestsOnConnectionReached: false,
   _defaultKeepAlive: true,
   useChunkedEncodingByDefault: true,
   sendDate: false,
   _removedConnection: false,
   _removedContLen: false,
   _removedTE: false,
   _contentLength: null,
   _hasBody: true,
   _trailer: '',
   finished: true,
   _headerSent: true,
   _closed: false,
   socket: TLSSocket {
     _tlsOptions: [Object],
     _secureEstablished: true,
     _securePending: false,
     _newSessionPending: false,
     _controlReleased: true,
     secureConnecting: false,
     _SNICallback: null,
     servername: 'bling.com.br',
     alpnProtocol: false,
     authorized: true,
     authorizationError: null,
     encrypted: true,
     _events: [Object: null prototype],
     _eventsCount: 10,
     connecting: false,
     _hadError: false,
     _parent: null,
     _host: 'bling.com.br',
     _readableState: [ReadableState],
     _maxListeners: undefined,
     _writableState: [WritableState],
     allowHalfOpen: false,
     _sockname: null,
     _pendingData: null,
     _pendingEncoding: '',
     server: undefined,
     _server: null,
     ssl: [TLSWrap],
     _requestCert: true,
     _rejectUnauthorized: true,
     parser: null,

tem mais abaixo mas excedeu o tamanho. Acho que dá para entender com a resposta acima.

1 resposta

Olá, José! Tudo bem com você?

Peço desculpa pela demora em responder o seu tópico.

Ao analisar o código que você compartilhou, notei que você está definindo o cabeçalho da requisição com o tipo de conteúdo "application/xml". No entanto, no código em si, você está enviando os dados como texto simples, sem definir explicitamente o tipo de conteúdo.

Uma possível solução seria definir o tipo de conteúdo no cabeçalho da requisição como "text/xml". Dessa forma, o servidor entenderá que você está enviando um arquivo XML. Aqui está um exemplo de como você pode fazer isso:

const headerBling = {
  headers: {
    'Accept': 'application/xml',
    'Content-Type': 'text/xml',
    'x-api-key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  }
};

axios.put(vamosVer.urlPost, vamosVer.agoravai, headerBling)
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err);
  });

Além disso, verifique se a URL que você está usando para fazer a requisição está correta e se todos os parâmetros necessários estão sendo passados corretamente.

Espero que essa sugestão possa te ajudar a resolver o problema. Se você tiver mais alguma dúvida, estarei à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.