2011-12-14 13 views
13

Se eseguiamo window.location = "http://MyApi.com/Pdf";, il browser OTTIENE l'URL http://MyApi.com/Pdf. Ma se vogliamo impostare l'intestazione authentication della richiesta prima di eseguire GET dell'URL perché il server è un server REST e non supporta i cookie. Come fare questo?JavaScript - Come impostare l'intestazione della richiesta per un browser GET

In tutti i casi, sto utilizzando $.ajax per chiamare il servizio ma questa volta ho bisogno di mostrare la risposta in una nuova finestra. La risposta è un contenuto di file PDF.

Grazie in anticipo.

risposta

8

Nei browser più recenti, si potrebbe essere in grado di utilizzare blob:

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
<button onclick="tryit();">PDF</button> 
<script> 
    function tryit() { 
     var win = window.open('_blank'); 
     downloadFile('/pdf', function(blob) { 
      var url = URL.createObjectURL(blob); 
      win.location = url; 
     }); 
    } 
    function downloadFile(url, success) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', url, true); 
     xhr.setRequestHeader("Authorization", "Basic " + btoa("username:password")); 
     xhr.responseType = "blob"; 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4) { 
       if (success) success(xhr.response); 
      } 
     }; 
     xhr.send(null); 
    } 

</script> 
</body> 
</html> 

In IE, chiedere all'utente:

window.navigator.msSaveOrOpenBlob(blob, 'readme.pdf'); 

P.S. È possibile verificare il backend in Node:

router.get('/pdf', function(req, res) { 
    if(req.headers.authorization !== 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') return res.status(403).send('Not allowed'); 
    res.sendFile(path.join(__dirname, 'public', 'render.pdf')); 
}); 
router.get('/', function(req, res) { 
    res.render('index'); 
}); 
+0

Sembra che funzionerà. provato? – IsmailS

+1

Sì, con Chrome 48 -> Nodo 0.12 Contrassegnalo? :) – malix

+0

supportato dai principali browser più recenti. Ma ancora in bozza. https: //developer.mozilla.org/it/docs/Web/API/URL/createObjectURL # Browser_compatibility – IsmailS

-2

È necessario configurare $.ajax utilizzando beforeSend. Di seguito un esempio, ma ovviamente non so se l'esatta configurazione funzionerà per te senza alcun codice da guardare.

$.ajax({ 
    url : '/model/user.json', 
    dataType : 'json', 
    'beforeSend' : function(xhr) { 
      var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
      var base64 = Crypto.util.bytesToBase64(bytes); 
      xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function(xhr, ajaxOptions, thrownError) { 
     reset(); 
     onError('Invalid username or password. Please try again.'); 
     $('#loginform #user_login').focus(); 
    }, 
    success : function(model) { 
     cookies(); 
      ... 
    } 
}); 

Per far funzionare tutto questo è necessario crypto-js.

+0

non abbastanza rispondere alla domanda credo, la risposta è un documento PDF da rendere dal browser. –

+0

Mi permetta di chiarire di nuovo. Non ho bisogno di impostare l'intestazione per una richiesta Ajax. Voglio impostare l'intestazione per la richiesta GET completa della pagina. Sto già usando 'beforeSend' per impostare l'intestazione per tutte le richieste Ajax. – IsmailS

1

Se non si cura di nascondere o offuscare le credenziali utente poi basta usare pianura GET authentification: uso http://username:[email protected]/ invece di http://MyApi.com/

+0

Grazie mille per aver risposto. Ho un meccanismo di autenticazione personalizzato. :(. Quindi il valore dell'intestazione 'authorization' assomiglia a' CompanyNameToken '. Non mi dispiacerebbe includere il token nell'URL se c'è qualche stranezza come questa. – IsmailS

1

lo fa deve essere un ottenere?

La ragione per cui sto chiedendo è che si può semplicemente avere un modulo POST (su un target = "_ BLANK") che pubblica qualsiasi cosa ma mostra un file incorporato in una nuova finestra. Ovviamente questo non risolverà il problema con le intestazioni personalizzate, ma dato che puoi anche utilizzare POST con jquery.ajax, che ti consente di impostare le intestazioni personali, avrai il meglio di entrambi i mondi.

Ecco uno jQuery plugin che crea dinamicamente tale modulo per scaricare qualsiasi file. Si potrebbe utilizzare questo come un punto di riferimento ...

Spero che questo aiuti

Problemi correlati