2016-06-15 24 views
5

Sto provando a creare un'app angolare per accedere ai dati dal database MarkLogic. Sto usando MarkLogic Rest API per accedere ai dati. Quando provo a eseguire l'app, ottengo il seguente errore.Errore 'Access-Control-Allow-Origin' anche dopo aver seguito 2 approcci

XMLHttpRequest non può caricare http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=json. Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine 'http://localhost:8080' non è quindi consentita l'accesso .

Ho letto molte risposte relative a questo problema su StackOverflow ma non ho potuto ottenere nulla di funzionamento. Ecco cosa ho provato fino ad ora.

1) Setting the response header using xdmp in qconsole 
xdmp:add-response-header("Access-Control-Allow-Origin", "*"); 
xdmp:add-response-header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
xdmp:add-response-header("Access-Control-Allow-Headers", "x-requested-with, X-Auth-Token, Content-Type"); 
2) Tried to add headers by using REST [Extention][1]. Here is the example.sjs file which I wrote. 
a) function get(context, params) { 
    var results = []; 
    context.outputTypes = []; 
    for (var pname in params) { 
    if (params.hasOwnProperty(pname)) { 
     results.push({name: pname, value: params[pname]}); 
     context.outputTypes.push('application/json'); 
    } 
    } 
    context.outputStatus = [201, 'Created My New Resource']; 
    context.outputHeaders = 
    {'Access-Control-Allow-Origin' : '*', 'Access-Control-Allow-Methods' : 'GET, OPTIONS, DELETE', 'Access-Control-Allow-Headers' : 'x-requested-with, X-Auth-Token, Content-Type'}; 
    return xdmp.arrayValues(results); 
}; 
exports.GET = get; 
b) curl --anyauth --user admin:admin -X PUT -i -H "Content-type: application/vnd.marklogic-javascript" --data-binary @./example.sjs http://192.168.192.75:9550/LATEST/config/resources/example 

Non sembra funzionare, in entrambi i modi. Qualcuno può dirmi se sto facendo qualcosa di sbagliato? o Se ci sono altri modi per farlo funzionare? Grazie in anticipo.

risposta

1

Un modo alternativo che ho trovato è definire la mia trasformazione. Questo aiuta solo per il metodo di richiesta GET non per gli altri. Ecco cosa ho creato.

function customCors(context, params, content) 
{ 
    xdmp.addResponseHeader('Access-Control-Allow-Origin' , '*'); 
    xdmp.addResponseHeader('Access-Control-Allow-Methods' , 'GET, PUT, POST, HEAD, OPTIONS, DELETE'); 
    xdmp.addResponseHeader('Access-Control-Allow-Headers' , 'X-Requested-With, X-Auth-Token, Content-Type, Accept'); 
    return content; 
}; 

exports.transform = customCors; 

per utilizzare questo dobbiamo usare una proprietà chiamata trasformazione. Come questo.

http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&trasformare = customCors & format = json

Aggiornamento: allungò la mano per Mark Logic, che ha detto che questo non può essere fatto in un approccio 2-tier. Dobbiamo avere uno strato intermedio (3 livelli) come java per aggiungere origini/metodi ecc.

1

Ciò è probabilmente dovuto a Access-Control-Allow-Origin non consentito * durante l'autenticazione. Oppure potrebbe essere dovuto a richieste di pre-volo inviate quando la richiesta non è standard. Pre-flight sono le richieste OPTIONS inviate prima del GET/POST/etc. per verificare se è possibile effettuare la chiamata effettiva. Il modo in cui ci siamo avvicinati è quello di affrontare gli endpoint REST di MarkLogic con Apache HTTP come proxy. Abbiamo il seguente in una configurazione di virtualhost.

ProxyPass è il punto in cui viene mappato il proxy per l'endpoint ML REST. L'altra roba imposta l'intestazione Access-Control-Allow-Origin sul nome dell'host richiedente. Questo è richiesto poiché '*' non è consentito durante l'autenticazione. Le impostazioni RewriteCond e RewriteRule vengono utilizzate per rispondere alla richiesta OPZIONI pre-volo e restituiscono semplicemente uno stato HTTP 200.

<IfModule mod_headers.c> 
    SetEnvIf Origin "^http(s)?://(.+\.)?(localhost|domain.com)(:[0-9]+)?$" origin_is=$0 
    Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is 
    Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" 
    Header always set Access-Control-Max-Age "1000" 
    Header always set Access-Control-Allow-Headers "X-Requested-With, content-type, Access-Control-Allow-Origin, Authorization, X-User-Id" 
    </IfModule> 

    RewriteEngine on 
    RewriteCond %{REQUEST_METHOD} OPTIONS 
    RewriteRule ^(.*)$ $1 [R=200,L] 

    # People DB REST Endpoint 
    ProxyPass /people_dev http://10.239.12.223:8050 

È possibile fare lo stesso con NginX o qualsiasi altro proxy HTTP.

+0

@Tang grazie per la risposta. Stavo guardando un approccio a 2 livelli. Ad esempio Angolare con Marklogic che utilizza l'API Rest. Ho trovato un modo alternativo sin d'ora per raggiungere questo obiettivo. Lo posterò ora. – DMA

Problemi correlati