2015-10-21 12 views
6

ho definito un $resource ad un endpoint API che restituisce una risposta contenente diversi headers ma nella funzione transformResponse config la maggior parte delle intestazioni mancano dalla argomento headersGetter funzioni.

Come posso risolvere il problema?

intestazione di risposta delle API

HTTP/1.1 201 Created 
Server: Apache-Coyote/1.1 
x-content-type-options: nosniff 
x-xss-protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
x-frame-options: DENY 
Access-Control-Allow-Origin: http://localhost:9000 
access-control-allow-methods: POST, PUT, GET, DELETE, OPTIONS 
access-control-allow-headers: Content-Type 
Access-Control-Allow-Credentials: true 
Content-Disposition: attachment; filename="testCall.pcap" 
FileName: testCall.pcap 
Content-Type: application/pcap 

s' transformResponse intestazioni

Pragma: no-cache 
Content-Type: application/pcap 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Expires: 0 

app.factory("MyService", function ($resource, ENV, _) { 
    return { 
     testCall: $resource(ENV.apiEndpoint + "/test-call", {}, { 
      launch: { 
       method: 'POST', 
       isArray: false, 
       headers:{'Accept':'application/octet-stream'}, 
       responseType: 'blob', 
       cache: false, 
       transformResponse: function(data, headers){ 
        var filename = headers('Content-Disposition'); //headers('FileName') 
        var contentType = headers('Content-Type'); 

        var file = new Blob([data], { 
         type: contentType 
        }); 

        var fileURL = URL.createObjectURL(file); 
        var a   = document.createElement('a'); 
        a.href  = fileURL; 
        a.target  = '_blank'; 
        a.download = filename; 
        document.body.appendChild(a); 
        a.click(); 
       } 
      } 
     }), 
     searchOptions: $resource(ENV.apiEndpoint + "//search-options") 
    }; 
}); 

risposta

11

Supponiamo che si stanno facendo CORS chiama, intestazioni di risposta non sono tutti esposti . Sul lato server è necessario aggiungere l'intestazione di risposta "Access-Control-Expose-Headers" nel filtro CORS.

ad es. Per leggere un header di risposta personalizzata denominata "X-MY-Header1" e "X-MY-header2" con CORS chiamata, intestazione Aggiungi server

Access-Control-Expose-Headers: "X-MY-HEADER1, X-MY-HEADER2"

Vedere la risposta @nancoder a https://stackoverflow.com/a/23726352/4684232

+0

Thks per la tua risposta. Sì, è una chiamata CORS su un sottodominio ma le intestazioni di risposta sopra sono quelle ricevute dal server Angular (le ho ricevute con Firebug). Quindi per me penso che _La struttura angolare pulisce alcuni di essi prima di 'transformResponse' ... – gudepier

+1

+1 Man, volevo sapere esattamente questa risposta come un matto, mi sono imbattuto nello stesso problema quando ho provato a leggere il' Location' intestazione dopo aver creato una risorsa in un cross-domain RESTFull Api e prendere l'ID dalla posizione dell'intestazione, aggiungendo l'intestazione sul server ha fatto il trucco! Tks per l'ottima risposta. –

+0

infine, sono riuscito a ottenere il mio token personalizzato. grazie Joe e Adriano. –

Problemi correlati