javascript - NodeJS - Como fazer download de ficheiro via Request?


Eu tenho um ExternalServe (a correr no Localhost) quando uso o navegador para fazer o pedido:

localhost:2013/ExternalServer/getfilebyname?filename=getStatus.json

Então o browser descarregou getStatus.json para a pasta de Downloads.

No meu projeto NodeJS, quero transferir o ficheiro getStatus.json e fiz:

download.js

var http = require('http');
var fs = require('fs');

function getFile (){

  var file = fs.createWriteStream("./../lib/user.json");
  var req = http.get("http://localhost:2013/ExternalServer/getfilebyname?filename=getStatus.json", function(res) {
    res.pipe(file);
});
}

getFile();

mas quando eu executo: node download.js o sistema retorna

<html><head><title>Apache Tomcat/8.0.0-RC1 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 401 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>This request requires HTTP authentication.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/8.0.0-RC1</h3></body></html>

Como consertar isto?

Melhores cumprimentos

Resposta #1

Está a receber a seguinte resposta de erro:

Este pedido requer autenticação HTTP

Sugere-se adicionar a informação de Autorização no cabeçalho. Como:

var options = {
    host: 'localhost',
    port: 2013,
    path: '/ExternalServer/getfilebyname?filename=getStatus.json',
    headers: {
     'Authorization': 'Basic ' + new Buffer(uname + ':' + pword).toString('base64')
   }         
};

request = http.get(options, function(res) {
   res.pipe(file);
});

em caso de proxy, pode usar o seguinte cabeçalho em vez disso:

Proxy-Authorization

Resposta #2

O servidor quer um nome de utilizador e uma palavra-passe, ou exige outro mecanismo de autorização, antes de permitir que aceda ao ficheiro desta forma.

Para ver como fornecer um utilizador e uma palavra-passe ao fazer o pedido em node.js, veja Como usar http.client em Node.js se houver autorização básica

Como sabemos que isto poderia ser o problema?

Duas strings interessantes no sistema retornam:

HTTP Status 401

e

This request requires HTTP authentication

Da Wikipédia: Lista de Códigos de Estado HTTP

401 Não autorizado Semelhante ao 403 Proibido, mas especificamente para uso quando a autenticação é necessária e falhou ou ainda não foi fornecida. A resposta deve incluir um campo de cabeçalho WWW-Authenticate contendo um desafio aplicável ao recurso solicitado. Veja Autenticação de acesso básico e Autenticação de acesso Digest.

Outra possibilidade é que um servidor poderia ser configurado para emitir 401 em vez de 403, mas na verdade não aceita quaisquer nomes de utilizador ou palavras-passe.