2016-06-15 11 views
5

मैं मार्कलॉगिक डेटाबेस से डेटा तक पहुंचने के लिए एक कोणीय ऐप बनाने की कोशिश कर रहा हूं। मैं डेटा तक पहुंचने के लिए मार्कलॉगिक बाकी एपीआई का उपयोग कर रहा हूं। जब मैं ऐप चलाने की कोशिश करता हूं, तो मुझे निम्न त्रुटि मिलती है।'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' त्रुटि 2 दृष्टिकोणों के बाद भी

XMLHttpRequest http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&format=json लोड नहीं कर सकता है। अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है। उत्पत्ति 'http://localhost:8080' इसलिए पहुंच की अनुमति नहीं है।

मैंने स्टैक ओवरफ्लो पर इस मुद्दे से संबंधित बहुत सारे उत्तर पढ़े हैं लेकिन कुछ भी काम नहीं कर सका। यहां तक ​​कि मैंने अभी तक कोशिश की है।

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 

ऐसा लगता है कि यह किसी भी तरह से काम नहीं करता है। क्या कोई मुझे बता सकता है कि क्या मैं कुछ गलत कर रहा हूं? या अगर यह काम करने के अन्य तरीके हैं? अग्रिम धन्यवाद।

उत्तर

1

मुझे मिला एक वैकल्पिक तरीका है अपने स्वयं के परिवर्तन को परिभाषित करना। यह केवल अनुरोध विधि को अन्य लोगों के लिए नहीं देता है। मैंने जो बनाया है वह यहां है।

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; 

इसका उपयोग करने के लिए हमें ट्रांसफॉर्म नामक एक संपत्ति का उपयोग करना होगा। इस प्रकार सं.

http://192.168.192.75:9550/v1/keyvalue?element=fieldId&value=1005&को बदलने = customCors & प्रारूप = json

अद्यतन: MarkLogic तक पहुंचा, उन्होंने कहा कि यह एक 2 स्तरीय दृष्टिकोण में नहीं किया जा सकता। हमारे पास उत्पत्ति/तरीके आदि जोड़ने के लिए जावा की तरह एक मध्यम परत (3-स्तरीय) होना चाहिए।

1

शायद यह Access-Control-Allow-Origin होने की अनुमति नहीं है जब आप प्रमाणीकरण कर रहे हों। या यह प्री-फ्लाइट अनुरोधों के कारण हो सकता है जो अनुरोध गैर-मानक होने पर भेजा जाता है। प्री-फ्लाइट विकल्प अनुरोध हैं जिन्हें जीईटी/पोस्ट/आदि से पहले भेजा जाता है। यह सत्यापित करने के लिए कि वास्तविक कॉल किया जा सकता है या नहीं। जिस तरह से हमने संपर्क किया है वह प्रॉक्सी के रूप में अपाचे HTTP के साथ मार्कलॉगिक आरईएसटी एंडपॉइंट्स के सामने है। हमारे पास वर्चुअलहोस्ट कॉन्फ़िगरेशन में निम्न है।

प्रॉक्सीपास वह जगह है जहां एमएल रीस्ट एंडपॉइंट के लिए प्रॉक्सी मैप किया गया है। अन्य सामान अनुरोध मेजबान के नाम पर 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 

आप एनजिनएक्स या किसी अन्य HTTP प्रॉक्सी के साथ ऐसा ही कर सकते हैं।

+0

@Tang आपके उत्तर के लिए धन्यवाद। मैं एक 2 स्तरीय दृष्टिकोण देख रहा था। यानी आराम एपीआई का उपयोग कर मार्कलॉगिक के साथ कोणीय। मुझे इसे प्राप्त करने के लिए अभी एक वैकल्पिक तरीका मिला है। मैं इसे अभी पोस्ट करूंगा। – DMA

संबंधित मुद्दे