CouchDB междоменный доступ из XMLHttpRequest?
В настоящее время веб-приложение должно предлагать какой-то междоменный HTTP-заголовок для доступа к данным в другом домене: http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_Sharing
Есть ли способ настроить CouchDB для поддержки неограниченного междоменного доступа? (он может использовать apache httpd внутренне). Я использую только внутреннюю цель db.
Ответы
Ответ 1
Вы можете использовать функцию отображения CouchDB, чтобы установить заголовок Access-Control-Allow-Origin.
function(doc, req) {
return {
body : 'whatever',
headers : {
"Access-Control-Allow-Origin": "\"*\""
}
}
}
Подробнее о функциях шоу здесь: http://guide.couchdb.org/draft/show.html
Ответ 2
Самый простой способ решить эту проблему - использовать локально установленный Apache Web Server с включенным модулем mod_proxy и настроенную директиву ProxyPass.
Начните с базовой установки
index.html имеет следующий контент
<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var http = XMLHttpRequest();
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); // ! WE WILL CHANGE THIS LINE
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200) {
console.debug('it works');
}
};
http.send(null)
</script>
<head><title>Test Access to CouchDB</title></head>
<body>
</body>
</html>
Если вы попробуете это сейчас, это не сработает из-за проблемы с перекрестным доменом (в этом случае порты не соответствуют 8181!= 5984).
Как это исправить
- настроить Apache (apache_home/conf/httpd.conf)
- uncomment
LoadModule proxy_module modules/mod_proxy.so
- uncomment
LoadModule proxy_http_module modules/mod_proxy_http.so
- добавить
ProxyPass /couchdb http://127.0.0.1:5984
(как свойство верхнего уровня, такое как ServerAdmin)
- перезапустить Apache
- изменить index.html
- замените
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true);
на http.open('GET', '/couchdb/_all_dbs', true);
Попробуйте сейчас, и вы увидите, что он работает на консоли javascript (я использовал Firebug Console)
Ответ 3
CouchDB 1.3 решает это с помощью CORS: https://wiki.apache.org/couchdb/CORS
Ответ 4
Eonil, я тоже хочу использовать междоменный доступ, но не поддерживается CouchDB,
вы можете проголосовать за эту функцию, которая будет реализована здесь:
https://issues.apache.org/jira/browse/COUCHDB-431
ps: этот запрос функции был создан 23/Jul/09:( Надеюсь, они нас услышали.
Ответ 5
вам следует включить CORS в CouchDB > 1.3. Это так же просто, как отредактировать default.ini
и параметр enable_cors = true
, а затем изменить origins
в разделе [cors]
, чтобы получить нужные URL-адреса верхнего уровня. Например, я должен был сделать следующее для белого списка моего локального сервера grunt.
enable_cors = true
[cors]
origins = http://127.0.0.1:9000
чтобы полностью ответить на этот вопрос, хотя вы хотите установить
origins = *
хотя можно утверждать, что это уязвимость, и вам, вероятно, следует больше ограничивать исход.
Ответ 6
Как я решил, это написать 2-строчный CGI-конвертер Rebol, а затем попросить мой Ajax в JQuery вызывать мой CGI вместо URL-адреса для получения данных из Couchdb:
Rebol [
{wrapper to overcome cross-domain fetching of data from couchdb}
]
print "Content-type: application/json^/" ;text/plain^/"
print read http://127.0.0.1:5984/syncspace/_design/vals/_view/xxxx?group=true
Ответ 7
Я создал список, который возвращает JSONp... но по-прежнему поддерживает только поддержку
"jsonp": "function(head, req) {
var row;
var rows=[];
while(row = getRow()){
rows.push(row);
}
rj = JSON.stringify({\"rows\" : rows,\"total_rows\":rows.length});
return req.query.callback+\"(\"+rj+\");\";
}",