1

我在我的自定义休息端点中设置了“Access-Control-Allow-Origin”,但是当我从 javascript 调用这个 web 服务时,我收到以下错误

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.

以下是我设置响应标头的代码

(: 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", "*")
    ...
};

如何设置 OPTIONS 请求的响应标头?

4

3 回答 3

2

错误消息以The response had HTTP status code 401. 这是身份验证的问题,而不是访问控制标头的问题。您需要发送凭据,或将应用服务器切换到应用程序级身份验证。

于 2016-03-23T05:52:25.400 回答
2

如果有人感兴趣,以下是我所做的,而不是在 MarkLogic 自定义 rest-api 前面编写自定义 web 服务层。
我基本上有一个 Apache 服务器,它充当自定义 Marklogic 端点​​的代理。然后我为它设置了 CORS 标头.. 并且还捕获了 OPTIONS 请求并发送 200.. 只是让您知道,当请求具有授权时。'*'Access-Control-Allow-Origin *将不起作用..您需要指定主机..我做了一个放置正则表达式的解决方法,以下是我在我的 apache 配置或 .htaccess 文件中的做法

 <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
于 2016-03-24T13:33:51.107 回答
2

我最近遇到了类似的问题。在从浏览器发出请求时,浏览器会向 MarkLogic 发送一个附加的 OPTIONS 请求。但是我的路由器检查了一个 api_key,如果它不存在,我用一个 40x 代码响应。

在检查 api 密钥之前,只要传入的方法是 OPTIONS 就可以使用 200 代码来响应。所有其他方法检查 api 并返回适当的响应代码。

例如,如果您使用的是 xquery 路由器,您可以尝试以下操作:

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
:)

祝你好运!

于 2016-03-23T09:27:05.217 回答