5

MarkLogic データベースのデータにアクセスする角度アプリを構築しようとしています。MarkLogic REST API を使用してデータにアクセスしています。アプリを実行しようとすると、次のエラーが表示されます。

XMLHttpRequest はhttp://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=jsonを読み込めません 。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' http://localhost:8080 ' へのアクセスは許可されていません。

stackoverflow でこの問題に関連する多くの回答を読みましたが、何も機能しませんでした。これが私が今まで試したことです。

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

どちらの方法でも機能しないようです。私が何か間違ったことをしているなら、誰か教えてもらえますか?またはこれを機能させる他の方法がある場合は? 前もって感謝します。

4

2 に答える 2

1

私が見つけた別の方法の 1 つは、独自の変換を定義することです。これは、他のメソッドではなく、GET リクエスト メソッドにのみ役立ちます。これが私が作成したものです。

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;

これを使用するには、transform というプロパティを使用する必要があります。このような。

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

更新: MarkLogic に連絡したところ、これは 2 層アプローチでは実行できないとのことでした。オリジン/メソッドなどを追加するには、Java のような中間層 (3 層) が必要です。

于 2016-06-17T15:33:32.107 に答える
1

これはおそらくAccess-Control-Allow-Origin、認証を行っているときに許可されていないためです。または、リクエストが非標準のときに送信されるプリフライト リクエストが原因である可能性があります。プリフライトは、GET/POST/etc の前に送信される OPTIONS リクエストです。実際の呼び出しを行うことができるかどうかを検証します。これにアプローチした方法は、MarkLogic REST エンドポイントの前に Apache HTTP をプロキシとして配置することです。仮想ホスト構成には次のものがあります。

ProxyPass は、ML REST エンドポイントへのプロキシがマップされる場所です。他のものは、Access-Control-Allow-Originヘッダーを要求元ホストの名前に設定します。認証時に「*」が許可されていないため、これは必須です。RewriteCondとのRewriteRule設定は、飛行前の OPTIONS リクエストに応答するために使用され、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

NginX やその他の HTTP プロキシでも同じことができます。

于 2016-06-16T13:53:27.663 に答える