2016-03-22 5 views
1

Ich stelle in meinem benutzerdefinierten Rest Endpunkt die "Access-Control-Allow-Origin", aber wenn ich diesen Webservice von Javascript aufrufen, bekomme ich FolgendesMarkLogic Custom Rest Endpunkt gesetzt Access-Control-Allow-Origin für Preflight-Anfrage

Fehler
XMLHttpRequest cannot load http://10.239.12.22:8042/LATEST/resources/repoUIFacet?rs:q=TNF. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://gprulcd707873.abbvienet.com:8000' is therefore not allowed access. The response had HTTP status code 401. 

es folgt der Code, wo ich die Antwort-Header gesetzt

(: Function responding to GET method - must use local name 'get':) 
declare function repoUIFacet:get($context as map:map, $params as map:map) as document-node()* 
{ 
    let $output-types := map:put($context,"output-types","application/json") 

    let $_ := xdmp:add-response-header("Access-Control-Allow-Origin", "*") 
    ... 
}; 

Wie kann ich die Antwort-Header für eine OPTIONS-Anforderung eingestellt?

Antwort

2

Die Fehlermeldung endet mit The response had HTTP status code 401. Dies ist ein Problem mit der Authentifizierung, nicht mit dem Zugriffssteuerungsheader. Sie müssen Anmeldeinformationen senden oder den App-Server zur Authentifizierung auf Anwendungsebene schalten.

HTH!

+0

I Ich bekomme einen Preflight-Fehler ... Es ist CORS-Anfrage, Problem .. – Ravi

+0

Nein, ich glaube, Sie hatten einen Auth-Fehler auf der Preflight-Anfrage. Sinnvollerweise müssen alle Anfragen an MarkLogic normal authentifiziert werden, also auch Preflight-Anfragen. Ein Proxy oder eine Zwischenschicht dazwischen wie in Ihrer Antwort ist eine gute Lösung, um solche Auth-Checks zu umgehen. – grtjn

2

Ich stieß in letzter Zeit in ein ähnliches Problem. Bei einer Anfrage vom Browser sendet der Browser eine zusätzliche OPTIONS-Anfrage an MarkLogic. Allerdings hat mein Router nach einem api_key gesucht und wenn es nicht existierte, habe ich mit einem 40x Code geantwortet.

Was funktionierte, war mit einem 200-Code responsing immer wenn die eingehende Methode OPTIONS vor dem Überprüfen der API-Taste ist. Alle anderen Methoden überprüfen die API und geben den entsprechenden Antwortcode zurück.

z.B. wenn Sie einen XQuery-Router verwenden, könnten Sie so etwas wie dies versuchen:

let $method := fn:lower-case(xdmp:get-request-method()) 

(: Intercept OPTIONS method and respond immediately :) 
if ($methods = 'options') then 
    xdmp:set-response-code(200, 'OK') 
else (: 
    invoke the endpoint function "$method", e.g. repoUIFacet:get 
:) 

Viel Glück!

+0

Ich sah OPTIONS, für benutzerdefinierte Rest-api in MarkLOGIC .. Ich sah rewriter.xml und sie keine Anfrage für OPTIONS .. Aber ich konnte Marklogic Rest API mit einem Apache-Server und setzen Sie die CORS auf Apache, anstatt einen Wrapper schreiben .. – Ravi

2

Wenn jemand interessiert ist, ist nach dem, was ich tat stattdessen eine benutzerdefinierte webservice Schicht vor Marklogic benutzerdefinierten rest-api zu schreiben ..
Ich habe im Grunde einen Apache-Server, der als Proxy-Endpunkte individuellen Marklogic agiert. Dann setze ich den CORS-Header dafür. Und fange auch die OPTIONS-Anfrage und sende eine 200 .. Lass dich einfach wissen, dass wenn die Anfrage Autorisierung hat. die ‚*‘ Access-Control-Allow-Origin *, wird nicht funktionieren .. Sie müssen die Hosts angeben .. Ich habe eine Abhilfe für einen regulären Ausdruck setzen, finden Sie, wie ich es tun in meinem Apache-Konfiguration oder .htaccess-Datei

<IfModule mod_headers.c> 
    SetEnvIf Origin "^http(s)?://(.+\.)?(YOUR_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] 

    ProxyPass /cr_dev http://10.239.12.22:8042/LATEST/resources 
    ProxyPassReverse /cr_dev/ http://10.239.12.22:8042/LATEST/resources