2016-06-15 20 views
5

Ich versuche eine eckige App für den Zugriff auf Daten aus der MarkLogic-Datenbank zu erstellen. Ich verwende die MarkLogic Rest-API, um auf die Daten zuzugreifen. Wenn ich versuche, die App auszuführen, erhalte ich den folgenden Fehler.'Access-Control-Allow-Origin'-Fehler, selbst nachdem ich zwei Ansätze verfolgt habe

XMLHttpRequest nicht http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=json laden. Auf der angeforderten -Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Herkunft 'http://localhost:8080' ist daher nicht erlaubt Zugriff.

Ich habe viele Antworten zu diesem Thema auf Stackoverflow gelesen, konnte aber nichts arbeiten. Hier ist, was ich bis jetzt versucht habe.

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 

Es scheint nicht zu funktionieren, egal wie. Kann mir bitte jemand sagen, ob ich etwas falsch mache? oder Wenn es andere Möglichkeiten gibt, wie das funktioniert? Vielen Dank im Voraus.

Antwort

1

Eine alternative Möglichkeit, die ich gefunden habe, ist meine eigene Transformation zu definieren. Dies hilft nur für GET-Anfrage-Methode nicht für andere. Hier ist was ich erstellt habe.

Um dies zu verwenden, müssen wir eine Eigenschaft namens transform verwenden. So was.

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

Update: ausstreckte zu Marklogic, sagte sie dies nicht in einem 2-Tier-Ansatz durchgeführt werden kann. Wir müssen eine mittlere Schicht (3-stufig) wie Java haben, um Ursprünge/Methoden usw. hinzuzufügen.

1

Dies ist wahrscheinlich aufgrund Access-Control-Allow-Origin nicht zulässig sein *, wenn Sie Authentifizierung durchführen. Oder es könnte aufgrund von Pre-Flight-Anfragen sein, die gesendet werden, wenn die Anfrage nicht Standard ist. Pre-Flight sind OPTIONS-Anfragen, die vor dem GET/POST/etc gesendet werden. um zu überprüfen, ob der eigentliche Anruf getätigt werden kann. Die Art und Weise, wie wir uns diesem Problem angenähert haben, besteht darin, MarkLogic-REST-Endpunkte mit Apache HTTP als Proxy zu konfrontieren. Wir haben folgendes in einer Virtualhost-Konfiguration.

Im ProxyPass wird der Proxy für den ML REST-Endpunkt zugeordnet. Das andere stuff setzt den Header Access-Control-Allow-Origin auf den Namen des anfordernden Hosts. Dies ist erforderlich, da '*' bei der Authentifizierung nicht erlaubt ist. Die Einstellungen RewriteCond und RewriteRule werden verwendet, um auf die OPTIONS-Anfrage vor dem Flug zu reagieren, und geben einfach einen HTTP 200-Status zurück.

<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 

Sie können das gleiche mit NginX oder einem anderen HTTP-Proxy tun.

+0

@Tang danke für Ihre Antwort. Ich habe mir einen zweistufigen Ansatz angesehen. d. h. schräg mit Marklogic unter Verwendung der Rest-API. Ich habe jetzt einen alternativen Weg gefunden, dies zu erreichen. Ich werde es jetzt posten. – DMA