2016-06-15 14 views
5

Tôi đang cố gắng xây dựng một ứng dụng góc để truy cập dữ liệu từ cơ sở dữ liệu MarkLogic. Tôi đang sử dụng API còn lại MarkLogic để truy cập dữ liệu. Khi tôi cố gắng chạy ứng dụng, tôi nhận được lỗi sau.Lỗi 'Truy cập-Kiểm soát-Cho phép-Xuất xứ' ngay cả sau khi làm theo 2 cách tiếp cận

XMLHttpRequest không thể tải http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=json. Không có tiêu đề 'Access-Control-Allow-Origin' xuất hiện trên tài nguyên được yêu cầu . Do đó, nguồn gốc 'http://localhost:8080' không được phép truy cập .

Tôi đã đọc rất nhiều câu trả lời liên quan đến vấn đề này trên stackoverflow nhưng không thể nhận được bất cứ điều gì làm việc. Đây là những gì tôi đã thử cho đến bây giờ.

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 

Dường như cách này cũng không hoạt động. Bất cứ ai có thể vui lòng cho tôi biết nếu tôi làm gì sai? hoặc Nếu có cách nào khác để làm việc này? Cảm ơn trước.

Trả lời

1

Một cách khác tôi tìm thấy là xác định biến đổi của riêng tôi. Điều này chỉ giúp cho phương thức yêu cầu GET không dành cho người khác. Đây là những gì tôi tạo ra.

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; 

để sử dụng điều này, chúng tôi phải sử dụng thuộc tính được gọi là biến đổi. Như thế này.

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

Cập nhật: Đạt ra MarkLogic, họ nói điều này không thể được thực hiện trong một cách tiếp cận 2 tầng. Chúng ta phải có một lớp giữa (3 tầng) như java để thêm Nguồn gốc/Phương pháp, v.v.

1

Điều này có thể do Access-Control-Allow-Origin không được phép * khi bạn đang thực hiện xác thực. Hoặc có thể là do yêu cầu trước chuyến bay được gửi khi yêu cầu không chuẩn. Chuyến bay trước là các yêu cầu OPTIONS được gửi trước GET/POST/etc. để xác thực liệu cuộc gọi thực tế có thể được thực hiện hay không. Cách chúng tôi đã tiếp cận này là để phía trước MarkLogic REST thiết bị đầu cuối với Apache HTTP như một proxy. Chúng tôi có những điều sau đây trong một cấu hình virtualhost.

ProxyPass là nơi proxy đến điểm cuối ML REST được ánh xạ. Các thứ khác đặt tiêu đề Access-Control-Allow-Origin vào tên của máy chủ yêu cầu. Điều này là bắt buộc vì '*' không được phép khi xác thực. Cài đặt RewriteCondRewriteRule được sử dụng để phản hồi yêu cầu OPTIONS trước chuyến bay và chỉ trả lại trạng thái 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 

Bạn có thể làm tương tự với NginX hoặc bất kỳ proxy HTTP nào khác.

+0

@Tang cảm ơn câu trả lời của bạn. Tôi đã nhìn vào cách tiếp cận 2 tầng. tức là Góc với Marklogic bằng cách sử dụng API Rest. Tôi tìm thấy một cách thay thế như bây giờ để đạt được điều này. Tôi sẽ đăng nó ngay bây giờ. – DMA

Các vấn đề liên quan